46#define G_EVAL "GModelDataMultiplicative::eval(GObservation&, "\
48#define G_NPRED "GModelDataMultiplicative::npred(GEnergy&, GTime&, "\
50#define G_MC "GModelDataMultiplicative::mc(GObservation&, GRan&)"
51#define G_READ "GModelDataMultiplicative::read(GXmlElement&)"
52#define G_WRITE "GModelDataMultiplicative::write(GXmlElement&)"
53#define G_COMPONENT_INDEX "GModelDataMultiplicative::component(int&)"
54#define G_COMPONENT_NAME "GModelDataMultiplicative::component(std::string&)"
55#define G_APPEND "GModelDataMultiplicative::append(GModelData&, "\
154 if (
this != &model) {
219 bool constant =
true;
222 for (
int i = 0; i <
m_models.size(); ++i) {
264 const bool& gradients)
const
273 value =
m_models[0]->eval(event, obs, gradients);
276 for (
int i = 1; i <
m_models.size(); ++i) {
277 value *=
m_models[i]->eval(event, obs, gradients);
286 for (
int i = 0; i <
m_models.size(); ++i) {
292 for (
int j = 0; j <
m_models.size(); ++j) {
294 factor *=
m_models[j]->eval(event, obs,
false);
299 for (
int ipar = 0; ipar <
m_models[i]->size(); ++ipar) {
314 #if defined(G_NAN_CHECK)
316 std::cout <<
"*** ERROR: GModelDataMultiplicative::eval():";
317 std::cout <<
" NaN/Inf encountered";
318 std::cout <<
" (value=" << value;
319 std::cout <<
")" << std::endl;
352 const int& offset)
const
359 bool grad = ((gradients != NULL) && (npars > 0));
363 if (gradients->
columns() != npars) {
365 " columns in gradient matrix differs from number "
367 "in model. Please provide a compatible gradient "
371 if (gradients->
rows() != nevents) {
373 " rows in gradient matrix differs from number "
375 "observation. Please provide a compatible "
388 std::vector<GVector> component_values(
m_models.size());
394 for (
int i = 0; i <
m_models.size(); ++i) {
395 component_values[i] =
m_models[i]->eval(obs, gradients, ioffset);
403 for (
int i = 0; i <
m_models.size(); ++i) {
407 values = component_values[i];
410 values *= component_values[i];
423 for (
int j = 0; j <
m_models.size(); ++j) {
425 factor *= component_values[j];
430 for (
int ipar = 0; ipar <
m_models[i]->size(); ++ipar) {
461 const GTime& obsTime,
535 for (
int i = 0; i < num; ++i) {
551 std::string msg =
"Model type \""+
type+
"\" unknown. The following "
552 "model types are available: "+registry.
content()+
553 ". Please specify one of the available model "
561 std::string msg =
"Model type \""+
type+
"\" is not a data model. "
562 "Please specify a data model.";
567 model->
read(*source);
571 std::string msg =
"Model \""+model->
name()+
"\" is for instrument "
572 "\""+model->
instruments()+
"\" but model container "
574 "specify a data model that is compliant with the "
575 "container instrument.";
606 for (
int k = 0; k < n; ++k) {
617 src = xml.
append(
"source");
629 for (
int i = 0; i <
m_models.size(); i++) {
636 for (
int j = 0; j < cpy->
size(); ++j) {
640 std::string parname = par.
name();
689 for (
int i = 0; i <
m_models.size(); i++) {
691 std::string msg =
"Attempt to append model with name \""+
692 model.
name()+
"\" to multiplicative data model "
693 "container, but a component with the same name "
694 "exists already in the container. Every "
695 "component in the container needs to have a "
706 std::string msg =
"Model \""+model.
name()+
"\" is for instrument "
709 "specify a data model that is compliant with the "
710 "container instrument.";
721 int npars =
m_models[index]->size();
724 for (
int ipar = 0; ipar < npars; ++ipar) {
753 if (index >=
m_models.size() || index < 0) {
778 for (
int i = 0; i <
m_models.size(); ++i) {
787 std::string msg =
"Model component \""+
name+
"\" not found. Please "
788 "specify a valid model component name.";
812 result.append(
"=== GModelDataMultiplicative ===");
821 for (
int i = 0; i <
size(); ++i) {
844 m_type =
"MultiplicativeData";
869 for (
int i = 0; i < num; ++i) {
875 for (
int i = 0; i <
m_models.size(); ++i) {
881 for (
int ipar = 0; ipar < model->
size(); ++ipar) {
884 GModelPar& par = model->operator[](ipar);
903 for (
int i = 0; i <
m_models.size(); ++i) {
Exception handler interface definition.
Sparse matrix class definition.
const GModelDataMultiplicative g_data_multi_seed
#define G_COMPONENT_INDEX
Multiplicative data model class interface definition.
Model registry class definition.
Abstract observation base class interface definition.
Random number generator class definition.
Class that handles energies in a unit independent way.
Abstract interface for the event classes.
Abstract event container class.
virtual int size(void) const =0
const int & rows(void) const
Return number of matrix rows.
const int & columns(void) const
Return number of matrix columns.
Sparse matrix class interface definition.
void multiply_column(const int &column, const GVector &vector)
Multiply matrix column with vector.
Multiplicative data model class.
void copy_members(const GModelDataMultiplicative &model)
Copy class members.
virtual bool is_constant(void) const
Return if model is constant.
virtual GModelDataMultiplicative & operator=(const GModelDataMultiplicative &model)
Assignment operator.
virtual ~GModelDataMultiplicative(void)
Destructor.
virtual GEvents * mc(const GObservation &obs, GRan &ran) const
Return simulated events.
GModelDataMultiplicative(void)
Void constructor.
virtual void clear(void)
Clear multiplicative data model.
virtual void write(GXmlElement &xml) const
Write model into XML element.
void init_members(void)
Initialise class members.
virtual std::string print(const GChatter &chatter=NORMAL) const
Print multiplicative data model information.
virtual GModelDataMultiplicative * clone(void) const
Clone multiplicative data model.
virtual void read(const GXmlElement &xml)
Read model from XML element.
int components(void) const
Return number of data model components.
void append(const GModelData &model)
Append data model component.
void free_members(void)
Delete class members.
const GModelData * component(const int &index) const
Return data model by index.
virtual double eval(const GEvent &event, const GObservation &obs, const bool &gradients=false) const
Return model values and gradients.
std::vector< GModelData * > m_models
Container of data models.
std::string m_type
Model type.
virtual std::string type(void) const
Return model type.
virtual double npred(const GEnergy &obsEng, const GTime &obsTime, const GObservation &obs) const
Return spatially integrated data model.
Abstract data model class.
virtual GModelData * clone(void) const =0
Clones object.
void init_members(void)
Initialise class members.
virtual void write(GXmlElement &xml) const =0
void free_members(void)
Delete class members.
virtual GModelData & operator=(const GModelData &model)
Assignment operator.
virtual void read(const GXmlElement &xml)=0
Interface definition for the model registry class.
GModel * alloc(const std::string &name) const
Allocate model of given name.
std::vector< GModelPar * > m_pars
Pointers to all model parameters.
void write_attributes(GXmlElement &xml) const
Write model attributes.
int size(void) const
Return number of parameters in model.
std::string instruments(void) const
Returns instruments to which model applies.
void read_attributes(const GXmlElement &xml)
Read model attributes.
const std::string & name(void) const
Return parameter name.
Abstract observation base class.
virtual GEvents * events(void)
Return events.
double gradient(void) const
Return parameter gradient.
const std::string & name(void) const
Return parameter name.
Random number generator class.
std::string content(void) const
Return list of names in registry.
const GXmlAttribute * attribute(const int &index) const
Return attribute.
virtual GXmlNode * append(const GXmlNode &node)
Append XML child node.
virtual GXmlElement * element(const int &index)
Return pointer to GXMLElement child.
virtual int elements(void) const
Return number of GXMLElement children of node.
std::string parformat(const std::string &s, const int &indent=0)
Convert string in parameter format.
bool is_infinite(const double &x)
Signal if argument is infinite.
bool is_notanumber(const double &x)
Signal if argument is not a number.
std::string str(const unsigned short int &value)
Convert unsigned short integer value into string.
bool contains(const std::string &str, const std::string &substring)
Checks if a substring is in a string.
std::vector< std::string > split(const std::string &s, const std::string &sep)
Split string.
void xml_check_type(const std::string &origin, GXmlElement &xml, const std::string &type)
Checks the model type.