GammaLib 2.0.0
Loading...
Searching...
No Matches
GCOMModelDRBPhibarNodes.cpp
Go to the documentation of this file.
1/***************************************************************************
2 * GCOMModelDRBPhibarNodes.cpp - COMPTEL DRB model fitting class *
3 * ----------------------------------------------------------------------- *
4 * copyright (C) 2012-2022 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- *
6 * *
7 * This program is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 * *
20 ***************************************************************************/
21/**
22 * @file GCOMModelDRBPhibarNodes.cpp
23 * @brief COMPTEL DRB Phibar nodes model fitting class implementation
24 * @author Juergen Knoedlseder
25 */
26
27/* __ Includes ___________________________________________________________ */
28#ifdef HAVE_CONFIG_H
29#include <config.h>
30#endif
31#include <typeinfo>
32#include "GException.hpp"
33#include "GTools.hpp"
34#include "GModelRegistry.hpp"
36#include "GCOMObservation.hpp"
37#include "GCOMEventBin.hpp"
38
39/* __ Constants __________________________________________________________ */
40
41/* __ Globals ____________________________________________________________ */
43const GModelRegistry g_com_drb_fitting_registry(&g_com_drb_fitting_seed);
44
45/* __ Method name definitions ____________________________________________ */
46#define G_EVAL "GCOMModelDRBPhibarNodes::eval(GEvent&, GObservation&, bool&)"
47#define G_NRED "GCOMModelDRBPhibarNodes::npred(GEnergy&, GTime&, "\
48 "GObservation&)"
49#define G_MC "GCOMModelDRBPhibarNodes::mc(GObservation&, GRan&)"
50#define G_READ "GCOMModelDRBPhibarNodes::read(GXmlElement&)"
51#define G_WRITE "GCOMModelDRBPhibarNodes::write(GXmlElement&)"
52
53/* __ Macros _____________________________________________________________ */
54
55/* __ Coding definitions _________________________________________________ */
56
57/* __ Debug definitions __________________________________________________ */
58
59
60/*==========================================================================
61 = =
62 = Constructors/destructors =
63 = =
64 ==========================================================================*/
65
66/***********************************************************************//**
67 * @brief Void constructor
68 *
69 * Constructs an empty COMPTEL DRB fitting model.
70 ***************************************************************************/
72{
73 // Initialise members
75
76 // Return
77 return;
78}
79
80
81/***********************************************************************//**
82 * @brief XML constructor
83 *
84 * @param[in] xml XML element.
85 *
86 * Constructs a COMPTEL DRB fitting model from the information that is found
87 * in an XML element. Please refer to the method GCOMModelDRBPhibarNodes::read
88 * to learn more about the information that is expected in the XML element.
89 ***************************************************************************/
91 GModelData(xml)
92{
93 // Initialise members
95
96 // Read XML
97 read(xml);
98
99 // Return
100 return;
101}
102
103
104/***********************************************************************//**
105 * @brief Copy constructor
106 *
107 * @param[in] model COMPTEL DRB fitting model.
108 *
109 * Constructs a COMPTEL DRB fitting model by copying information from an
110 * existing model. Note that the copy is a deep copy, so the original object
111 * can be destroyed after the copy without any loss of information.
112 ***************************************************************************/
114 GModelData(model)
115{
116 // Initialise private members for clean destruction
117 init_members();
118
119 // Copy members
120 copy_members(model);
121
122 // Return
123 return;
124}
125
126
127/***********************************************************************//**
128 * @brief Destructor
129 *
130 * Destroys a COMPTEL DRB fitting model.
131 ***************************************************************************/
133{
134 // Free members
135 free_members();
136
137 // Return
138 return;
139}
140
141
142/*==========================================================================
143 = =
144 = Operators =
145 = =
146 ==========================================================================*/
147
148/***********************************************************************//**
149 * @brief Assignment operator
150 *
151 * @param[in] model COMPTEL DRB fitting model.
152 * @return COMPTEL DRB fitting model
153 *
154 * Assigns the information from a COMPTEL DRB fitting model to the actual
155 * object. Note that a deep copy of the information is performed, so the
156 * original object can be destroyed after the assignment without any loss of
157 * information.
158 ***************************************************************************/
160{
161 // Execute only if object is not identical
162 if (this != &model) {
163
164 // Copy base class members
165 this->GModelData::operator=(model);
166
167 // Free members
168 free_members();
169
170 // Initialise members
171 init_members();
172
173 // Copy members
174 copy_members(model);
175
176 } // endif: object was not identical
177
178 // Return
179 return *this;
180}
181
182
183/*==========================================================================
184 = =
185 = Public methods =
186 = =
187 ==========================================================================*/
188
189/***********************************************************************//**
190 * @brief Clear instance
191 *
192 * Resets the object to a clean initial state. All information that resided
193 * in the object will be lost.
194 ***************************************************************************/
196{
197 // Free class members (base and derived classes, derived class first)
198 free_members();
200 this->GModel::free_members();
201
202 // Initialise members
203 this->GModel::init_members();
205 init_members();
206
207 // Return
208 return;
209}
210
211
212/***********************************************************************//**
213 * @brief Clone instance
214 *
215 * @return Pointer to deep copy of COMPTEL DRB fitting model.
216 *
217 * Clone a COMPTEL DRB fitting model. Cloning performs a deep copy of the
218 * information, so the original object can be destroyed after cloning without
219 * any loss of information.
220 ***************************************************************************/
225
226
227/***********************************************************************//**
228 * @brief Evaluate function
229 *
230 * @param[in] event Observed event.
231 * @param[in] obs Observation.
232 * @param[in] gradients Compute gradients?
233 * @return Background model value.
234 *
235 * @exception GException::invalid_argument
236 * Observation is not a COMPTEL observation.
237 * Event is not a COMPTEL event bin.
238 *
239 * Evaluates the COMPTEL DRB fitting model.
240 ***************************************************************************/
242 const GObservation& obs,
243 const bool& gradients) const
244{
245 // Extract COMPTEL observation
246 const GCOMObservation* observation = dynamic_cast<const GCOMObservation*>(&obs);
247 if (observation == NULL) {
248 std::string cls = std::string(typeid(&obs).name());
249 std::string msg = "Observation of type \""+cls+"\" is not a COMPTEL "
250 "observations. Please specify a COMPTEL observation "
251 "as argument.";
253 }
254
255 // Extract COMPTEL event bin
256 const GCOMEventBin* bin = dynamic_cast<const GCOMEventBin*>(&event);
257 if (bin == NULL) {
258 std::string cls = std::string(typeid(&event).name());
259 std::string msg = "Event of type \""+cls+"\" is not a COMPTEL event. "
260 "Please specify a COMPTEL event as argument.";
262 }
263
264 // Initialise value
265 double value = 0.0;
266
267 // Optionally initialise gradients
268 if (gradients) {
269 for (int i = 0; i < m_values.size(); ++i) {
270 m_values[i].factor_gradient(0.0);
271 }
272 }
273
274 // Get bin index
275 int index = bin->index();
276
277 // Get bin size.
278 double size = bin->size();
279
280 // Continue only if bin size is positive
281 if (size > 0.0) {
282
283 // Initialise scaling factor
284 double scale = 1.0;
285
286 // Get DRB model value
287 value = observation->drb().map().pixels()[index] / size;
288
289 // If the model has a single scaling factor then use the first
290 // parameter as scaling factor of the model
291 if (m_scale) {
292
293 // Get scale factor
294 scale = m_values[0].value();
295
296 // Optionally compute gradients
297 if (gradients) {
298
299 // Compute partial derivative
300 double grad = (m_values[0].is_free())
301 ? value * m_values[0].scale() : 0.0;
302
303 // Set gradient
304 m_values[0].factor_gradient(grad);
305
306 } // endif: gradient computation was requested
307
308 } // endif: model is a scaling factor
309
310 // ... otherwise perform a linear interpolation
311 else {
312
313 // Get Phibar value
314 double phibar = bin->dir().phibar();
315
316 // Update evaluation cache
317 update_cache();
318
319 // Set node array for linear interpolation
320 m_nodes.set_value(phibar);
321
322 // Get indices and weights for interpolation
323 int inx_left = m_nodes.inx_left();
324 int inx_right = m_nodes.inx_right();
325 double wgt_left = m_nodes.wgt_left();
326 double wgt_right = m_nodes.wgt_right();
327
328 // Get scale factor
329 scale = m_values[inx_left].value() * wgt_left +
330 m_values[inx_right].value() * wgt_right;
331
332 // Optionally compute gradients
333 if (gradients) {
334
335 // Compute partial derivatives
336 double g_left = (m_values[inx_left].is_free())
337 ? wgt_left * value * m_values[inx_left].scale()
338 : 0.0;
339 double g_right = (m_values[inx_right].is_free())
340 ? wgt_right * value * m_values[inx_right].scale()
341 : 0.0;
342
343 // Set gradients
344 m_values[inx_left].factor_gradient(g_left);
345 m_values[inx_right].factor_gradient(g_right);
346
347 } // endif: gradient computation was requested
348
349 } // endelse: performed linear interpolation
350
351 // Compute background value
352 value *= scale;
353
354 // Compile option: Check for NaN/Inf
355 #if defined(G_NAN_CHECK)
356 if (gammalib::is_notanumber(value) || gammalib::is_infinite(value)) {
357 std::cout << "*** ERROR: GCOMModelDRBPhibarNodes::eval";
358 std::cout << "(index=" << index << "):";
359 std::cout << " NaN/Inf encountered";
360 std::cout << " (value=" << value;
361 std::cout << ", scale=" << scale;
362 std::cout << ")" << std::endl;
363 }
364 #endif
365
366 } // endif: binsize was positive
367
368 // Return
369 return value;
370}
371
372
373/***********************************************************************//**
374 * @brief Return spatially integrated data model
375 *
376 * @param[in] obsEng Measured event energy.
377 * @param[in] obsTime Measured event time.
378 * @param[in] obs Observation.
379 * @return Spatially integrated data model.
380 *
381 * @exception GException::feature_not_implemented
382 * Method is not implemented.
383 *
384 * Spatially integrates the data model for a given measured event energy and
385 * event time.
386 *
387 * @todo Implement method.
388 ***************************************************************************/
390 const GTime& obsTime,
391 const GObservation& obs) const
392{
393 // Initialise result
394 double npred = 0.0;
395
396 // Method is not implemented
397 std::string msg = "Spatial integration of data model is not implemented.";
399
400 // Return
401 return npred;
402}
403
404
405/***********************************************************************//**
406 * @brief Return simulated list of events
407 *
408 * @param[in] obs Observation.
409 * @param[in] ran Random number generator.
410 * @return COMPTEL event cube.
411 *
412 * @exception GException::feature_not_implemented
413 * Method is not implemented.
414 *
415 * Draws a sample of events from the COMPTEL DRB fitting model using a Monte
416 * Carlo simulation.
417 *
418 * @todo Implement method.
419 ***************************************************************************/
421 GRan& ran) const
422{
423 // Initialise new event cube
424 GCOMEventCube* cube = new GCOMEventCube;
425
426 // Method is not implemented
427 std::string msg = "Monte Carlo simulation of data model is not implemented.";
429
430 // Return
431 return cube;
432}
433
434
435/***********************************************************************//**
436 * @brief Read model from XML element
437 *
438 * @param[in] xml XML element.
439 *
440 * @exception GException::invalid_value
441 * Model definition requires at least one node.
442 *
443 * Read the COMPTEL DRB fitting model from an XML element.
444 *
445 * The model is composed of nodes that define the normalization value as
446 * function of Phibar value. The following XML file syntax is expected:
447 *
448 * <source name="Background" type="DRBPhibarNodes" instrument="COM">
449 * <node>
450 * <parameter name="Phibar" .../>
451 * <parameter name="Normalization" .../>
452 * </node>
453 * ...
454 * <node>
455 * <parameter name="Phibar" .../>
456 * <parameter name="Normalization" .../>
457 * </node>
458 * </source>
459 ***************************************************************************/
461{
462 // Free space for nodes
463 m_phibars.clear();
464 m_values.clear();
465
466 // Get number of nodes from XML file
467 int nodes = xml.elements("node");
468
469 // Throw an error if there are no nodes
470 if (nodes < 1) {
471 std::string msg = "DRB fitting model requires at least one Phibar "
472 "node. Please correct XML format.";
474 }
475
476 // Loop over all nodes
477 for (int i = 0; i < nodes; ++i) {
478
479 // Allocate node parameters
480 GModelPar phibar;
481 GModelPar normalization;
482
483 // Get node
484 const GXmlElement* node = xml.element("node", i);
485
486 // Read Phibar parameter
487 const GXmlElement* par = gammalib::xml_get_par(G_READ, *node, "Phibar");
488 phibar.read(*par);
489
490 // Read Normalization parameter
491 par = gammalib::xml_get_par(G_READ, *node, "Normalization");
492 normalization.read(*par);
493
494 // Set parameter names
495 std::string phibar_name = "Phibar layer "+gammalib::str(i);
496 std::string normalization_name = "Scale factor "+gammalib::str(i);
497
498 // Set Phibar attributes
499 phibar.name(phibar_name);
500 phibar.unit("deg");
501 phibar.has_grad(false);
502
503 // Set normalization attributes
504 normalization.name(normalization_name);
505 normalization.unit("");
506 normalization.has_grad(true);
507
508 // Push node parameters on list
509 m_phibars.push_back(phibar);
510 m_values.push_back(normalization);
511
512 } // endfor: looped over nodes
513
514 // Read model attributes
515 read_attributes(xml);
516
517 // Set pointers
518 set_pointers();
519
520 // Set evluation cache
521 set_cache();
522
523 // Return
524 return;
525}
526
527
528/***********************************************************************//**
529 * @brief Write model into XML element
530 *
531 * @param[in] xml XML element.
532 *
533 * @exception GException::model_invalid_spectral
534 * Existing XML element is not of required type
535 * @exception GException::model_invalid_parnum
536 * Invalid number of model parameters or nodes found in XML element.
537 * @exception GException::model_invalid_parnames
538 * Invalid model parameter names found in XML element.
539 *
540 * Write the COMPTEL DRB fitting model into an XML element.
541 *
542 * The model is composed of nodes that define the normalization value as
543 * function of Phibar value. The following XML file syntax is expected:
544 *
545 * <source name="Background" type="DRBPhibarNodes" instrument="COM">
546 * <node>
547 * <parameter name="Phibar" .../>
548 * <parameter name="Normalization" .../>
549 * </node>
550 * ...
551 * <node>
552 * <parameter name="Phibar" .../>
553 * <parameter name="Normalization" .../>
554 * </node>
555 * </source>
556 ***************************************************************************/
558{
559 // Initialise pointer on source
560 GXmlElement* src = NULL;
561
562 // Search corresponding source
563 int n = xml.elements("source");
564 for (int k = 0; k < n; ++k) {
565 GXmlElement* element = xml.element("source", k);
566 if (element->attribute("name") == name()) {
567 src = element;
568 break;
569 }
570 }
571
572 // If no source with corresponding name was found then append one.
573 // Set also the type and the instrument.
574 if (src == NULL) {
575 src = xml.append("source");
576 src->attribute("name", name());
577 src->attribute("type", type());
578 if (instruments().length() > 0) {
579 src->attribute("instrument", instruments());
580 }
581 }
582
583 // Verify model type
584 if (src->attribute("type") != type()) {
585 std::string msg = "Invalid model type \""+src->attribute("type")+"\" "
586 "found in XML file. Model type \""+type()+"\" "
587 "expected.";
589 }
590
591 // Determine number of nodes
592 int nodes = m_phibars.size();
593
594 // If XML element has 0 nodes then append nodes
595 if (src->elements() == 0) {
596 for (int i = 0; i < nodes; ++i) {
597 src->append(GXmlElement("node"));
598 }
599 }
600
601 // Verify that XML element has the required number of nodes
602 if (src->elements() != nodes || src->elements("node") != nodes) {
603 std::string msg = "Invalid number of nodes "+
604 gammalib::str(src->elements("node"))+
605 " found in XML file, but model requires exactly "+
606 gammalib::str(nodes)+" nodes.";
608 }
609
610 // Loop over all nodes
611 for (int i = 0; i < nodes; ++i) {
612
613 // Get node
614 GXmlElement* node = src->element("node", i);
615
616 // Write Phibar parameter
617 GXmlElement* par = gammalib::xml_need_par(G_WRITE, *node, "Phibar");
618 GModelPar mpar = m_phibars[i];
619 mpar.name("Phibar");
620 mpar.write(*par);
621
622 // Write Normalization parameter
623 par = gammalib::xml_need_par(G_WRITE, *node, "Normalization");
624 mpar = m_values[i];
625 mpar.name("Normalization");
626 mpar.write(*par);
627
628 } // endfor: looped over nodes
629
630 // Write model attributes
631 write_attributes(*src);
632
633 // Return
634 return;
635}
636
637
638/***********************************************************************//**
639 * @brief Print model information
640 *
641 * @param[in] chatter Chattiness.
642 * @return String containing model information.
643 ***************************************************************************/
644std::string GCOMModelDRBPhibarNodes::print(const GChatter& chatter) const
645{
646 // Initialise result string
647 std::string result;
648
649 // Continue only if chatter is not silent
650 if (chatter != SILENT) {
651
652 // Append header
653 result.append("=== GCOMModelDRBPhibarNodes ===");
654
655 // Append attributes
656 result.append("\n"+print_attributes());
657
658 // Append node summary
659 result.append("\n"+gammalib::parformat("Number of nodes"));
660 result.append(gammalib::str(m_phibars.size()));
661 result.append("\n"+gammalib::parformat("Number of parameters"));
662 result.append(gammalib::str(size()));
663 for (int i = 0; i < size(); ++i) {
664 result.append("\n"+m_pars[i]->print(chatter));
665 }
666
667 } // endif: chatter was not silent
668
669 // Return result
670 return result;
671}
672
673
674/*==========================================================================
675 = =
676 = Private methods =
677 = =
678 ==========================================================================*/
679
680/***********************************************************************//**
681 * @brief Initialise class members
682 ***************************************************************************/
684{
685 // Initialise members
686 m_phibars.clear();
687 m_values.clear();
688
689 // Initialise cache
690 m_scale = true;
691 m_fixed = true;
692 m_old_phibars.clear();
693 m_nodes.clear();
694
695 // Return
696 return;
697}
698
699
700/***********************************************************************//**
701 * @brief Copy class members
702 *
703 * @param[in] model Model.
704 ***************************************************************************/
706{
707 // Copy members
708 m_phibars = model.m_phibars;
709 m_values = model.m_values;
710
711 // Copy cache
712 m_scale = model.m_scale;
713 m_fixed = model.m_fixed;
715 m_nodes = model.m_nodes;
716
717 // Set parameter pointers
718 set_pointers();
719
720 // Return
721 return;
722}
723
724
725/***********************************************************************//**
726 * @brief Delete class members
727 ***************************************************************************/
729{
730 // Return
731 return;
732}
733
734
735/***********************************************************************//**
736 * @brief Set pointers
737 *
738 * Set pointers to all model parameters. The pointers are stored in a vector
739 * that is member of the GModel base class.
740 ***************************************************************************/
742{
743 // Clear parameter pointer(s)
744 m_pars.clear();
745
746 // Get number of nodes
747 int nodes = m_phibars.size();
748
749 // Set parameter pointers for all nodes
750 for (int i = 0; i < nodes; ++i) {
751
752 // Signal that Phibar values have no gradients
753 m_phibars[i].has_grad(false);
754
755 // Signal that values have gradients
756 m_values[i].has_grad(true);
757
758 // Set pointer
759 m_pars.push_back(&(m_phibars[i]));
760 m_pars.push_back(&(m_values[i]));
761
762 } // endfor: looped over nodes
763
764 // Return
765 return;
766}
767
768
769/***********************************************************************//**
770 * @brief Set evaluation cache
771 *
772 * Set the evaluation cache for fast computations. The evaluation cache
773 * consists of the Phibar values stored in a node array. The evaluation
774 * cache is only filled if at least 2 nodes are available. If only a single
775 * node is available, the model is considered as a simple scaling factor.
776 ***************************************************************************/
778{
779 // Clear any existing values
780 m_old_phibars.clear();
781 m_nodes.clear();
782 m_fixed = true;
783 m_scale = true; // Signals that model is a scale factor
784
785 // Determine number of parameters
786 int num = m_phibars.size();
787
788 // Continue only if we have at least two nodes
789 if (num >= 2) {
790
791 // Signal that model is not a scale factor
792 m_scale = false;
793
794 // Set Phibar node array. Signal if one of the Phibar values is free
795 for (int i = 0; i < num; ++i) {
796 double phibar = m_phibars[i].value();
797 m_nodes.append(phibar);
798 m_old_phibars.push_back(phibar);
799 if (m_phibars[i].is_free()) {
800 m_fixed = false;
801 }
802 }
803
804 } // endif: there were at least two nodes
805
806 // Return
807 return;
808}
809
810
811/***********************************************************************//**
812 * @brief Update evaluation cache
813 *
814 * Updates the evaluation cache by computing the
815 * changed.
816 ***************************************************************************/
818{
819 // Determine number of parameters
820 int num = m_phibars.size();
821
822 // Continue only if we have at least two nodes
823 if (num >= 2) {
824
825 // Update Phibar values
826 for (int i = 0; i < num; ++i) {
827 double phibar = m_phibars[i].value();
828 if (phibar != m_old_phibars[i]) {
829 m_nodes[i] = phibar;
830 m_old_phibars[i] = phibar;
831 }
832 }
833
834 } // endif: there were at least two nodes
835
836 // Return
837 return;
838}
#define G_WRITE
#define G_READ
COMPTEL event bin class interface definition.
#define G_NRED
const GCOMModelDRBPhibarNodes g_com_drb_fitting_seed
COMPTEL DRB Phibar nodes model fitting class interface definition.
COMPTEL observation class interface definition.
Exception handler interface definition.
#define G_EVAL
Model registry class definition.
Gammalib tools definition.
GChatter
Definition GTypemaps.hpp:33
@ SILENT
Definition GTypemaps.hpp:34
const GSkyMap & map(void) const
Return DRI sky map.
Definition GCOMDri.hpp:267
COMPTEL event bin class.
virtual const GCOMInstDir & dir(void) const
Return instrument direction of event bin.
const int & index(void) const
Return bin index.
virtual double size(void) const
Return size of event bin.
COMPTEL event bin container class.
void phibar(const double &phibar)
Set event Compton scatter angle.
COMPTEL DRB Phibar nodes model fitting class.
void free_members(void)
Delete class members.
GNodeArray m_nodes
Phibar node values.
std::vector< GModelPar > m_values
Node values.
void set_cache(void) const
Set evaluation cache.
virtual void read(const GXmlElement &xml)
Read model from XML element.
virtual double npred(const GEnergy &obsEng, const GTime &obsTime, const GObservation &obs) const
Return spatially integrated data model.
virtual GCOMEventCube * mc(const GObservation &obs, GRan &ran) const
Return simulated list of events.
virtual GCOMModelDRBPhibarNodes & operator=(const GCOMModelDRBPhibarNodes &model)
Assignment operator.
std::vector< double > m_old_phibars
Old Phibar values.
bool m_scale
Model is a scale factor.
GCOMModelDRBPhibarNodes(void)
Void constructor.
void init_members(void)
Initialise class members.
virtual GCOMModelDRBPhibarNodes * clone(void) const
Clone instance.
virtual ~GCOMModelDRBPhibarNodes(void)
Destructor.
virtual void clear(void)
Clear instance.
void set_pointers(void)
Set pointers.
virtual double eval(const GEvent &event, const GObservation &obs, const bool &gradients=false) const
Evaluate function.
void update_cache(void) const
Update evaluation cache.
bool m_fixed
All Phibar values are fixed.
virtual std::string print(const GChatter &chatter=NORMAL) const
Print model information.
virtual void write(GXmlElement &xml) const
Write model into XML element.
std::vector< GModelPar > m_phibars
Node Phibar values.
virtual std::string type(void) const
Return model type.
void copy_members(const GCOMModelDRBPhibarNodes &model)
Copy class members.
Interface class for COMPTEL observations.
const GCOMDri & drb(void) const
Return background model.
Class that handles energies in a unit independent way.
Definition GEnergy.hpp:48
Abstract interface for the event classes.
Definition GEvent.hpp:71
Abstract data model class.
void init_members(void)
Initialise class members.
void free_members(void)
Delete class members.
virtual GModelData & operator=(const GModelData &model)
Assignment operator.
Model parameter class.
Definition GModelPar.hpp:87
void write(GXmlElement &xml) const
Set or update parameter attributes in XML element.
void read(const GXmlElement &xml)
Extract parameter attributes from XML element.
Interface definition for the model registry class.
GModelPar & scale(const int &index)
Returns reference to scale parameter by index.
Definition GModel.cpp:369
std::vector< GModelPar * > m_pars
Pointers to all model parameters.
Definition GModel.hpp:178
void write_attributes(GXmlElement &xml) const
Write model attributes.
Definition GModel.cpp:723
void free_members(void)
Delete class members.
Definition GModel.cpp:672
void init_members(void)
Initialise class members.
Definition GModel.cpp:622
std::string print_attributes(void) const
Print model attributes.
Definition GModel.cpp:770
int size(void) const
Return number of parameters in model.
Definition GModel.hpp:233
std::string instruments(void) const
Returns instruments to which model applies.
Definition GModel.cpp:310
void read_attributes(const GXmlElement &xml)
Read model attributes.
Definition GModel.cpp:684
const std::string & name(void) const
Return parameter name.
Definition GModel.hpp:261
void set_value(const double &value) const
Set indices and weighting factors for interpolation.
const int & inx_right(void) const
Returns right node index.
const int & inx_left(void) const
Returns left node index.
const double & wgt_right(void) const
Returns right node weight.
const double & wgt_left(void) const
Returns left node weight.
void clear(void)
Clear node array.
void append(const double &node)
Append one node to array.
Abstract observation base class.
bool has_grad(void) const
Signal if parameter gradient is computed analytically.
const std::string & unit(void) const
Return parameter unit.
const std::string & name(void) const
Return parameter name.
Random number generator class.
Definition GRan.hpp:44
const double * pixels(void) const
Returns pointer to pixel data.
Definition GSkyMap.hpp:475
Time class.
Definition GTime.hpp:55
XML element node class.
const GXmlAttribute * attribute(const int &index) const
Return attribute.
virtual GXmlNode * append(const GXmlNode &node)
Append XML child node.
Definition GXmlNode.cpp:287
virtual GXmlElement * element(const int &index)
Return pointer to GXMLElement child.
Definition GXmlNode.cpp:640
virtual int elements(void) const
Return number of GXMLElement children of node.
Definition GXmlNode.cpp:586
std::string parformat(const std::string &s, const int &indent=0)
Convert string in parameter format.
Definition GTools.cpp:1143
bool is_infinite(const double &x)
Signal if argument is infinite.
Definition GTools.hpp:184
bool is_notanumber(const double &x)
Signal if argument is not a number.
Definition GTools.hpp:201
std::string str(const unsigned short int &value)
Convert unsigned short integer value into string.
Definition GTools.cpp:489
const GXmlElement * xml_get_par(const std::string &origin, const GXmlElement &xml, const std::string &name)
Return pointer to parameter with given name in XML element.
Definition GTools.cpp:1689
GXmlElement * xml_need_par(const std::string &origin, GXmlElement &xml, const std::string &name)
Return pointer to parameter with given name in XML element.
Definition GTools.cpp:1637