Commit 415f66bad4b0db6417dbf6a82ba590ea919e9ce6
1 parent
2207c982
rename GSkyModel to GModelSky
Showing
3 changed files
with
82 additions
and
36 deletions
include/GResponse.hpp
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * GResponse.hpp - Abstract response base class * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2008-2010 by Jurgen Knodlseder * | |
| 4 | + * copyright (C) 2008-2011 by Jurgen Knodlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software; you can redistribute it and/or modify * |
| ... | ... | @@ -26,7 +26,7 @@ |
| 26 | 26 | #include "GEvent.hpp" |
| 27 | 27 | #include "GEnergy.hpp" |
| 28 | 28 | #include "GTime.hpp" |
| 29 | -#include "GSkyModel.hpp" | |
| 29 | +#include "GModelSky.hpp" | |
| 30 | 30 | |
| 31 | 31 | /* __ Forward declarations _______________________________________________ */ |
| 32 | 32 | class GObservation; |
| ... | ... | @@ -66,10 +66,10 @@ public: |
| 66 | 66 | virtual GResponse* clone(void) const = 0; |
| 67 | 67 | virtual bool hasedisp(void) const = 0; |
| 68 | 68 | virtual bool hastdisp(void) const = 0; |
| 69 | - virtual double irf(const GEvent& event, const GSkyModel& model, | |
| 69 | + virtual double irf(const GEvent& event, const GModelSky& model, | |
| 70 | 70 | const GEnergy& srcEng, const GTime& srcTime, |
| 71 | 71 | const GObservation& obs) const = 0; |
| 72 | - virtual double npred(const GSkyModel& model, const GEnergy& srcEng, | |
| 72 | + virtual double npred(const GModelSky& model, const GEnergy& srcEng, | |
| 73 | 73 | const GTime& srcTime, |
| 74 | 74 | const GObservation& obs) const = 0; |
| 75 | 75 | virtual std::string print(void) const = 0; | ... | ... |
pyext/GResponse.i
| ... | ... | @@ -39,10 +39,10 @@ public: |
| 39 | 39 | virtual GResponse* clone(void) const = 0; |
| 40 | 40 | virtual bool hasedisp(void) const = 0; |
| 41 | 41 | virtual bool hastdisp(void) const = 0; |
| 42 | - virtual double irf(const GEvent& event, const GSkyModel& model, | |
| 42 | + virtual double irf(const GEvent& event, const GModelSky& model, | |
| 43 | 43 | const GEnergy& srcEng, const GTime& srcTime, |
| 44 | 44 | const GObservation& obs) const = 0; |
| 45 | - virtual double npred(const GSkyModel& model, const GEnergy& srcEng, | |
| 45 | + virtual double npred(const GModelSky& model, const GEnergy& srcEng, | |
| 46 | 46 | const GTime& srcTime, |
| 47 | 47 | const GObservation& obs) const = 0; |
| 48 | 48 | }; | ... | ... |
src/obs/GObservation.cpp
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * GObservation.cpp - Observation abstract base class * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2008-2010 by Jurgen Knodlseder * | |
| 4 | + * copyright (C) 2008-2011 by Jurgen Knodlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software; you can redistribute it and/or modify * |
| ... | ... | @@ -23,6 +23,7 @@ |
| 23 | 23 | #include <cmath> |
| 24 | 24 | #include "GException.hpp" |
| 25 | 25 | #include "GObservation.hpp" |
| 26 | +#include "GModelSky.hpp" | |
| 26 | 27 | #include "GModelSpatialPtsrc.hpp" |
| 27 | 28 | #include "GIntegral.hpp" |
| 28 | 29 | |
| ... | ... | @@ -33,8 +34,8 @@ |
| 33 | 34 | #define G_NPRED_SPEC "GObservation::npred_spec(GModel&, GTime&)" |
| 34 | 35 | #define G_NPRED_SPAT "GObservation::npred_spat(GModel&, int, GEnergy&,"\ |
| 35 | 36 | " GTime&)" |
| 36 | -#define G_NPRED_KERN "GObservation::npred_kern(GModel&, GSkyDir&, GEnergy&,"\ | |
| 37 | - " GTime&, GPointing&)" | |
| 37 | +#define G_NPRED_KERN "GObservation::npred_kern(GModel&, GSkyDir&,"\ | |
| 38 | + " GEnergy&, GTime&, GPointing&)" | |
| 38 | 39 | #define G_NPRED_GRAD_TEMP "GObservation::npred_grad_temp(GModel&, int)" |
| 39 | 40 | #define G_NPRED_GRAD_SPEC "GObservation::npred_grad_spec(GModel&, int,"\ |
| 40 | 41 | " GTime&)" |
| ... | ... | @@ -230,7 +231,7 @@ double GObservation::npred(const GModels& models, GVector* gradient) const |
| 230 | 231 | // Loop over models |
| 231 | 232 | for (int i = 0; i < models.size(); ++i) { |
| 232 | 233 | |
| 233 | - // Extract pointer to model (bypass const-correctness) | |
| 234 | + // Extract pointer to model (circumvent const-correctness) | |
| 234 | 235 | GModel* model = (GModel*)models(i); |
| 235 | 236 | |
| 236 | 237 | // Handle only components that are relevant for the actual |
| ... | ... | @@ -489,6 +490,8 @@ double GObservation::npred_spec(const GModel& model, |
| 489 | 490 | * |
| 490 | 491 | * @exception GException::no_response |
| 491 | 492 | * No valid instrument response function for observation. |
| 493 | + * @exception GException::feature_not_implemented | |
| 494 | + * Computation for data-space models not yet implemented. | |
| 492 | 495 | * |
| 493 | 496 | * Computes |
| 494 | 497 | * \f[\int_{\rm ROI} S(\vec{p}, E, t) |
| ... | ... | @@ -506,27 +509,47 @@ double GObservation::npred_spec(const GModel& model, |
| 506 | 509 | * \f${\rm ROI}\f$ is the region of interest that is stored in the |
| 507 | 510 | * GObservation::m_roi member. |
| 508 | 511 | * Note that the integration is performed by the GResponse::npred() method. |
| 512 | + * | |
| 513 | + * @todo Implement computation for data-space model | |
| 509 | 514 | ***************************************************************************/ |
| 510 | 515 | double GObservation::npred_spat(const GModel& model, |
| 511 | 516 | const GEnergy& srcEng, |
| 512 | 517 | const GTime& srcTime) const |
| 513 | 518 | { |
| 514 | - // Get response function | |
| 515 | - GResponse* rsp = response(); | |
| 516 | - if (rsp == NULL) | |
| 517 | - throw GException::no_response(G_NPRED_SPAT); | |
| 519 | + // Initialise result | |
| 520 | + double result = 0.0; | |
| 521 | + | |
| 522 | + // Get sky model (NULL if not a sky model) | |
| 523 | + GModelSky* sky = dynamic_cast<GModelSky*>((GModel*)&model); | |
| 524 | + | |
| 525 | + // Case A: We have a sky model | |
| 526 | + if (sky != NULL) { | |
| 518 | 527 | |
| 519 | - // Compute integrated IRF | |
| 520 | - double npred = rsp->npred(model, srcEng, srcTime, *this); | |
| 528 | + // Get response function | |
| 529 | + GResponse* rsp = response(); | |
| 530 | + if (rsp == NULL) | |
| 531 | + throw GException::no_response(G_NPRED_SPAT); | |
| 521 | 532 | |
| 522 | - // Compute source model | |
| 523 | - double source = 1.0; | |
| 524 | - GModel* ptr = (GModel*)&model; // bypass const-correctness | |
| 525 | - if (ptr->spectral() != NULL) npred *= ptr->spectral()->eval(srcEng); | |
| 526 | - if (ptr->temporal() != NULL) source *= ptr->temporal()->eval(srcTime); | |
| 533 | + // Compute integrated IRF | |
| 534 | + double npred = rsp->npred(*sky, srcEng, srcTime, *this); | |
| 535 | + | |
| 536 | + // Compute source model | |
| 537 | + double source = 1.0; | |
| 538 | + if (sky->spectral() != NULL) npred *= sky->spectral()->eval(srcEng); | |
| 539 | + if (sky->temporal() != NULL) source *= sky->temporal()->eval(srcTime); | |
| 540 | + | |
| 541 | + // Set result | |
| 542 | + result = source * npred; | |
| 543 | + | |
| 544 | + } | |
| 545 | + | |
| 546 | + // Case B: We have a data space model | |
| 547 | + else { | |
| 548 | + throw GException::feature_not_implemented(G_NPRED_SPAT); | |
| 549 | + } | |
| 527 | 550 | |
| 528 | 551 | // Return |
| 529 | - return (source * npred); | |
| 552 | + return result; | |
| 530 | 553 | } |
| 531 | 554 | |
| 532 | 555 | |
| ... | ... | @@ -681,30 +704,53 @@ double GObservation::npred_grad_spec(const GModel& model, int ipar, |
| 681 | 704 | * |
| 682 | 705 | * @exception GException::no_response |
| 683 | 706 | * No valid instrument response function for observation. |
| 707 | + * @exception GException::feature_not_implemented | |
| 708 | + * Method not yet implemented for data-space model. | |
| 709 | + * | |
| 710 | + * @todo Implement method for data-space model. | |
| 711 | + * @todo Avoid recomputation of gradients for same model parameters. | |
| 684 | 712 | ***************************************************************************/ |
| 685 | 713 | double GObservation::npred_grad_spat(const GModel& model, int ipar, |
| 686 | 714 | const GEnergy& srcEng, |
| 687 | 715 | const GTime& srcTime) const |
| 688 | 716 | { |
| 689 | - // Get response function | |
| 690 | - GResponse* rsp = response(); | |
| 691 | - if (rsp == NULL) | |
| 692 | - throw GException::no_response(G_NPRED_GRAD_SPAT); | |
| 717 | + // Initialise result | |
| 718 | + double result = 0.0; | |
| 719 | + | |
| 720 | + // Get sky model (NULL if not a sky model) | |
| 721 | + GModelSky* sky = dynamic_cast<GModelSky*>((GModel*)&model); | |
| 722 | + | |
| 723 | + // Case A: We have a sky model | |
| 724 | + if (sky != NULL) { | |
| 693 | 725 | |
| 694 | - // Compute integrated IRF | |
| 695 | - double npred = rsp->npred(model, srcEng, srcTime, *this); | |
| 726 | + // Get response function | |
| 727 | + GResponse* rsp = response(); | |
| 728 | + if (rsp == NULL) | |
| 729 | + throw GException::no_response(G_NPRED_GRAD_SPAT); | |
| 696 | 730 | |
| 697 | - // Compute source model | |
| 698 | - double source = 1.0; | |
| 699 | - GModel* ptr = (GModel*)&model; // bypass const-correctness | |
| 700 | - if (ptr->spectral() != NULL) source *= ptr->spectral()->eval_gradients(srcEng); | |
| 701 | - if (ptr->temporal() != NULL) source *= ptr->temporal()->eval_gradients(srcTime); | |
| 731 | + // Compute integrated IRF | |
| 732 | + double npred = rsp->npred(*sky, srcEng, srcTime, *this); | |
| 702 | 733 | |
| 703 | - // Extract requested model gradient | |
| 704 | - double grad = (*ptr)(ipar).gradient(); | |
| 734 | + // Compute source model | |
| 735 | + double source = 1.0; | |
| 736 | + if (sky->spectral() != NULL) source *= sky->spectral()->eval_gradients(srcEng); | |
| 737 | + if (sky->temporal() != NULL) source *= sky->temporal()->eval_gradients(srcTime); | |
| 705 | 738 | |
| 739 | + // Extract requested model gradient | |
| 740 | + double grad = (*sky)(ipar).gradient(); | |
| 741 | + | |
| 742 | + // Compute result | |
| 743 | + result = grad * npred; | |
| 744 | + | |
| 745 | + } | |
| 746 | + | |
| 747 | + // Case B: We have a data space model | |
| 748 | + else { | |
| 749 | + throw GException::feature_not_implemented(G_NPRED_SPAT); | |
| 750 | + } | |
| 751 | + | |
| 706 | 752 | // Return |
| 707 | - return (grad * npred); | |
| 753 | + return result; | |
| 708 | 754 | } |
| 709 | 755 | |
| 710 | 756 | ... | ... |