Commit 2d6c355346543c191dcc6700ea3bfa01e56a1fe1
Merge branch '1863_CovMat' into integration
# Conflicts: # ChangeLog # NEWS
Showing
4 changed files
with
82 additions
and
2 deletions
ChangeLog
NEWS
| 1 | 1 | New Features and Important Changes in GammaLib 1.2.0 |
| 2 | 2 | |
| 3 | -16 October 2016 | |
| 3 | +17 October 2016 | |
| 4 | 4 | |
| 5 | 5 | |
| 6 | 6 | 1. Introduction |
| ... | ... | @@ -54,6 +54,7 @@ The following methods have been added: |
| 54 | 54 | - GTime::now() |
| 55 | 55 | - GFits::publish() |
| 56 | 56 | - gammalib::rstrip_chars() |
| 57 | +- GObservations::save_covmat() | |
| 57 | 58 | |
| 58 | 59 | The following methods have been removed: |
| 59 | 60 | - <all classes>::eval_gradients() |
| ... | ... | @@ -179,6 +180,9 @@ times that depend on the geographic longitude. Finally, a now() method has |
| 179 | 180 | been added to the GTime class that sets the time to the current time (see |
| 180 | 181 | #1856). |
| 181 | 182 | |
| 183 | +The GObservations::save_covmat() method computes and saves the covariance | |
| 184 | +matrix into a FITS file (#1863). | |
| 185 | + | |
| 182 | 186 | |
| 183 | 187 | 11. Optimization module |
| 184 | 188 | ----------------------- | ... | ... |
include/GObservations.hpp
| ... | ... | @@ -129,6 +129,7 @@ public: |
| 129 | 129 | void optimize(GOptimizer& opt); |
| 130 | 130 | void errors(GOptimizer& opt); |
| 131 | 131 | void errors_hessian(void); |
| 132 | + void save_covmat(const GFilename& filename) const; | |
| 132 | 133 | void eval(void); |
| 133 | 134 | double logL(void) const; |
| 134 | 135 | int nobserved(void) const; | ... | ... |
src/obs/GObservations.cpp
| ... | ... | @@ -35,6 +35,9 @@ |
| 35 | 35 | #include "GObservationRegistry.hpp" |
| 36 | 36 | #include "GMatrixSparse.hpp" |
| 37 | 37 | #include "GOptimizer.hpp" |
| 38 | +#include "GFitsBinTable.hpp" | |
| 39 | +#include "GFitsTableStringCol.hpp" | |
| 40 | +#include "GFitsTableDoubleCol.hpp" | |
| 38 | 41 | |
| 39 | 42 | /* __ Method name definitions ____________________________________________ */ |
| 40 | 43 | #define G_AT "GObservations::at(int&)" |
| ... | ... | @@ -837,6 +840,77 @@ void GObservations::errors_hessian(void) |
| 837 | 840 | |
| 838 | 841 | |
| 839 | 842 | /***********************************************************************//** |
| 843 | + * @brief Save covariance matrix into FITS file | |
| 844 | + * | |
| 845 | + * @param[in] filename FITS filename. | |
| 846 | + * | |
| 847 | + * Saves the covariance matrix into FITS file. The covariance matrix is | |
| 848 | + * calculated as the inverse of the curvature matrix. | |
| 849 | + ***************************************************************************/ | |
| 850 | +void GObservations::save_covmat(const GFilename& filename) const | |
| 851 | +{ | |
| 852 | + // Calculate covariance matrix (circumvent const correctness) | |
| 853 | + GMatrixSparse covmat = | |
| 854 | + const_cast<GObservations*>(this)->m_fct.curvature()->invert(); | |
| 855 | + | |
| 856 | + // Create covariance matrix entry names | |
| 857 | + std::vector<std::string> covmat_entries; | |
| 858 | + for (int i = 0 ; i < m_models.size(); ++i) { | |
| 859 | + for (int j = 0; j < m_models[i]->size(); ++j) { | |
| 860 | + covmat_entries.push_back(m_models[i]->at(j).name() + "(" + | |
| 861 | + m_models[i]->name() + ")"); | |
| 862 | + } | |
| 863 | + } | |
| 864 | + | |
| 865 | + // Create binary table and columns | |
| 866 | + int size = covmat_entries.size(); | |
| 867 | + GFitsBinTable covmat_table; | |
| 868 | + GFitsTableStringCol par("Parameters", 1, 50, size); | |
| 869 | + GFitsTableDoubleCol cov("Covariance", 1, size*size); | |
| 870 | + | |
| 871 | + // Fill tables. We need to take the scale factors into account since the | |
| 872 | + // covariance matrix is for the unscaled parameters | |
| 873 | + int counter = 0; | |
| 874 | + for (int i = 0; i < size; ++i) { | |
| 875 | + par(0, i) = covmat_entries[i]; | |
| 876 | + for (int j = 0; j < size; ++j) { | |
| 877 | + cov(0, counter) = covmat(i,j) * m_models.pars()[i]->scale() | |
| 878 | + * m_models.pars()[j]->scale(); | |
| 879 | + ++counter; | |
| 880 | + } | |
| 881 | + } | |
| 882 | + | |
| 883 | + // Set dimension for covariance matrix column | |
| 884 | + std::vector<int> dim; | |
| 885 | + dim.push_back(size); | |
| 886 | + dim.push_back(size); | |
| 887 | + cov.dim(dim); | |
| 888 | + | |
| 889 | + // Append columns to table | |
| 890 | + covmat_table.append(par); | |
| 891 | + covmat_table.append(cov); | |
| 892 | + | |
| 893 | + // Set extension name | |
| 894 | + covmat_table.extname("Covariance Matrix"); | |
| 895 | + | |
| 896 | + // Allocate FITS object | |
| 897 | + GFits fits; | |
| 898 | + | |
| 899 | + // Append covariance matrix table to FITS object | |
| 900 | + fits.append(covmat_table); | |
| 901 | + | |
| 902 | + // Save FITS file to disk | |
| 903 | + fits.saveto(filename, true); | |
| 904 | + | |
| 905 | + // Close FITS object | |
| 906 | + fits.close(); | |
| 907 | + | |
| 908 | + // Return | |
| 909 | + return; | |
| 910 | +} | |
| 911 | + | |
| 912 | + | |
| 913 | +/***********************************************************************//** | |
| 840 | 914 | * @brief Evaluate function |
| 841 | 915 | * |
| 842 | 916 | * Evaluates the likelihood funtion at the actual set of parameters. | ... | ... |