Commit a7abb93f97175910de90cd33deffd6eb9f3a51a9
1 parent
e724faa8
Autodetect file format from filename (#1863)
Showing
11 changed files
with
385 additions
and
139 deletions
.gitignore
| @@ -113,6 +113,7 @@ test/*.fits | @@ -113,6 +113,7 @@ test/*.fits | ||
| 113 | test/*.xml | 113 | test/*.xml |
| 114 | test/*.trs | 114 | test/*.trs |
| 115 | test/*.html | 115 | test/*.html |
| 116 | +test/*.csv | ||
| 116 | test/test_csv*.dat | 117 | test/test_csv*.dat |
| 117 | test/test_url.dat | 118 | test/test_url.dat |
| 118 | test/reports/*.xml | 119 | test/reports/*.xml |
ChangeLog
| 1 | -2017-04-05 | 1 | +2017-04-10 |
| 2 | 2 | ||
| 3 | * Version 1.3.0 released | 3 | * Version 1.3.0 released |
| 4 | ========================= | 4 | ========================= |
| 5 | 5 | ||
| 6 | + Add GFilename::type() method (#1863) | ||
| 6 | Copy shared Python libraries instead of creating a symbolic link (#1987) | 7 | Copy shared Python libraries instead of creating a symbolic link (#1987) |
| 7 | Added FITS image conversion operators (#1986) | 8 | Added FITS image conversion operators (#1986) |
| 8 | If code originates from Git, always compile the Python bindings (#1985) | 9 | If code originates from Git, always compile the Python bindings (#1985) |
NEWS
| 1 | New Features and Important Changes in GammaLib 1.3.0.dev1 | 1 | New Features and Important Changes in GammaLib 1.3.0.dev1 |
| 2 | 2 | ||
| 3 | -5 April 2017 | 3 | +10 April 2017 |
| 4 | 4 | ||
| 5 | 5 | ||
| 6 | 1. Introduction | 6 | 1. Introduction |
| @@ -28,6 +28,7 @@ The following methods have been added: | @@ -28,6 +28,7 @@ The following methods have been added: | ||
| 28 | - GCTAEdisp2D::fetch | 28 | - GCTAEdisp2D::fetch |
| 29 | - GEbounds::set | 29 | - GEbounds::set |
| 30 | - GEnergies::set | 30 | - GEnergies::set |
| 31 | +- GFilename::type() | ||
| 31 | 32 | ||
| 32 | The following methods have been removed: | 33 | The following methods have been removed: |
| 33 | - ... | 34 | - ... |
| @@ -117,7 +118,8 @@ The GWcs base class now also supports CD keywords instead of CDELT keywords | @@ -117,7 +118,8 @@ The GWcs base class now also supports CD keywords instead of CDELT keywords | ||
| 117 | 118 | ||
| 118 | 13. Support module | 119 | 13. Support module |
| 119 | ------------------ | 120 | ------------------ |
| 120 | -None | 121 | +A GFilename::type() method has been added that returns the type of the file |
| 122 | +based on the file type extension (e.g. ".fits") (#1863). | ||
| 121 | 123 | ||
| 122 | 124 | ||
| 123 | 14. XML module | 125 | 14. XML module |
include/GFilename.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GFilename.hpp - Filename class * | 2 | * GFilename.hpp - Filename class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2015-2016 by Juergen Knoedlseder * | 4 | + * copyright (C) 2015-2017 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 * |
| @@ -62,8 +62,10 @@ | @@ -62,8 +62,10 @@ | ||
| 62 | class GFilename : public GBase { | 62 | class GFilename : public GBase { |
| 63 | 63 | ||
| 64 | // Friend functions | 64 | // Friend functions |
| 65 | - friend std::string operator+(const GFilename& filename, const std::string& string); | ||
| 66 | - friend std::string operator+(const std::string& string, const GFilename& filename); | 65 | + friend std::string operator+(const GFilename& filename, |
| 66 | + const std::string& string); | ||
| 67 | + friend std::string operator+(const std::string& string, | ||
| 68 | + const GFilename& filename); | ||
| 67 | friend bool operator==(const GFilename &a, const GFilename &b); | 69 | friend bool operator==(const GFilename &a, const GFilename &b); |
| 68 | friend bool operator!=(const GFilename &a, const GFilename &b); | 70 | friend bool operator!=(const GFilename &a, const GFilename &b); |
| 69 | 71 | ||
| @@ -89,6 +91,7 @@ public: | @@ -89,6 +91,7 @@ public: | ||
| 89 | std::string protocol(void) const; | 91 | std::string protocol(void) const; |
| 90 | std::string path(void) const; | 92 | std::string path(void) const; |
| 91 | std::string file(void) const; | 93 | std::string file(void) const; |
| 94 | + std::string type(void) const; | ||
| 92 | bool exists(void) const; | 95 | bool exists(void) const; |
| 93 | bool is_fits(void) const; | 96 | bool is_fits(void) const; |
| 94 | void remove(void) const; | 97 | void remove(void) const; |
include/GObservations.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GObservations.hpp - Observation container class * | 2 | * GObservations.hpp - Observation container class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2009-2016 by Juergen Knoedlseder * | 4 | + * copyright (C) 2009-2017 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 * |
| @@ -158,13 +158,16 @@ public: | @@ -158,13 +158,16 @@ public: | ||
| 158 | double npred(void) const; | 158 | double npred(void) const; |
| 159 | GMatrixSparse hessian(const GOptimizerPars& pars); | 159 | GMatrixSparse hessian(const GOptimizerPars& pars); |
| 160 | GMatrixSparse covariance(void) const; | 160 | GMatrixSparse covariance(void) const; |
| 161 | - void save(const GFilename& filename, bool csv = true) const; | 161 | + void save(const GFilename& filename) const; |
| 162 | 162 | ||
| 163 | protected: | 163 | protected: |
| 164 | // Protected methods | 164 | // Protected methods |
| 165 | - void init_members(void); | ||
| 166 | - void copy_members(const likelihood& fct); | ||
| 167 | - void free_members(void); | 165 | + void init_members(void); |
| 166 | + void copy_members(const likelihood& fct); | ||
| 167 | + void free_members(void); | ||
| 168 | + void save_csv(const GFilename& filename) const; | ||
| 169 | + void save_fits(const GFilename& filename) const; | ||
| 170 | + std::vector<std::string> covariance_names(void) const; | ||
| 168 | 171 | ||
| 169 | // Protected data members | 172 | // Protected data members |
| 170 | double m_value; //!< Function value | 173 | double m_value; //!< Function value |
pyext/GFilename.i
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GFilename.i - Filename class * | 2 | * GFilename.i - Filename class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2015-2016 by Juergen Knoedlseder * | 4 | + * copyright (C) 2015-2017 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 * |
| @@ -54,6 +54,7 @@ public: | @@ -54,6 +54,7 @@ public: | ||
| 54 | std::string protocol(void) const; | 54 | std::string protocol(void) const; |
| 55 | std::string path(void) const; | 55 | std::string path(void) const; |
| 56 | std::string file(void) const; | 56 | std::string file(void) const; |
| 57 | + std::string type(void) const; | ||
| 57 | bool exists(void) const; | 58 | bool exists(void) const; |
| 58 | bool is_fits(void) const; | 59 | bool is_fits(void) const; |
| 59 | void remove(void) const; | 60 | void remove(void) const; |
src/obs/GObservations_likelihood.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GObservations_likelihood.cpp - Likelihood function class * | 2 | * GObservations_likelihood.cpp - Likelihood function class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2009-2016 by Juergen Knoedlseder * | 4 | + * copyright (C) 2009-2017 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 * |
| @@ -621,88 +621,27 @@ GMatrixSparse GObservations::likelihood::covariance(void) const | @@ -621,88 +621,27 @@ GMatrixSparse GObservations::likelihood::covariance(void) const | ||
| 621 | 621 | ||
| 622 | 622 | ||
| 623 | /***********************************************************************//** | 623 | /***********************************************************************//** |
| 624 | - * @brief Save likelihood fit results into CSV or FITS file. | 624 | + * @brief Save likelihood fit results into a CSV or FITS file. |
| 625 | * | 625 | * |
| 626 | - * @param[in] filename CSV/FITS filename. | ||
| 627 | - * @param[in] csv save as CSV? (default: true) | 626 | + * @param[in] filename CSV or FITS filename. |
| 628 | * | 627 | * |
| 629 | - * Saves the likelihood fit results into a CSV/FITS file. For the moment the | ||
| 630 | - * method only writes the covariance matrix. | 628 | + * Saves the likelihood fit results into a CSV or FITS file. The result |
| 629 | + * format depends on the filename extension. If the extension is `.fits` or | ||
| 630 | + * `.fit` the file is written into a FITS file, otherwise it is written into | ||
| 631 | + * a CSV file. | ||
| 631 | ***************************************************************************/ | 632 | ***************************************************************************/ |
| 632 | -void GObservations::likelihood::save(const GFilename& filename, bool csv) const | 633 | +void GObservations::likelihood::save(const GFilename& filename) const |
| 633 | { | 634 | { |
| 634 | - // Get covariance matrix | ||
| 635 | - GMatrixSparse covmat = covariance(); | 635 | + // Get file type |
| 636 | + std::string filetype = filename.type(); | ||
| 636 | 637 | ||
| 637 | - // Create covariance matrix entry names | ||
| 638 | - std::vector<std::string> covmat_entries; | ||
| 639 | - for (int i = 0 ; i < m_this->m_models.size(); ++i) { | ||
| 640 | - for (int j = 0; j < m_this->m_models[i]->size(); ++j) { | ||
| 641 | - covmat_entries.push_back(m_this->m_models[i]->at(j).name() + "(" + | ||
| 642 | - m_this->m_models[i]->name() + ")"); | ||
| 643 | - } | 638 | + // If file type is a FITS file then write save covariance matrix into a |
| 639 | + // FITS file, otherwise save the covariance matrix into a CSV file | ||
| 640 | + if (filetype == "fits") { | ||
| 641 | + save_fits(filename); | ||
| 644 | } | 642 | } |
| 645 | - | ||
| 646 | - // Create binary table and columns | ||
| 647 | - int size = covmat_entries.size(); | ||
| 648 | - | ||
| 649 | - if (csv) { | ||
| 650 | - GCsv table(size + 1, size); | ||
| 651 | - | ||
| 652 | - // Fill CSV header | ||
| 653 | - for (int i = 0; i < size; ++i) { | ||
| 654 | - table.string(0, i, covmat_entries[i]); | ||
| 655 | - } | ||
| 656 | - | ||
| 657 | - // Fill CSV table | ||
| 658 | - for (int i = 0; i < size; ++i) { | ||
| 659 | - for (int j = 0; j < size; j ++) { | ||
| 660 | - table.real(i+1, j, covmat(i,j)); | ||
| 661 | - } | ||
| 662 | - } | ||
| 663 | - | ||
| 664 | - // Save CSV table | ||
| 665 | - table.save(filename, " ", true); | ||
| 666 | - } else { | ||
| 667 | - | ||
| 668 | - GFitsBinTable covmat_table; | ||
| 669 | - GFitsTableStringCol par("Parameters", 1, 50, size); | ||
| 670 | - GFitsTableDoubleCol cov("Covariance", 1, size*size); | ||
| 671 | - | ||
| 672 | - // Fill tables | ||
| 673 | - int counter = 0; | ||
| 674 | - for (int i = 0; i < size; ++i) { | ||
| 675 | - par(0, i) = covmat_entries[i]; | ||
| 676 | - for (int j = 0; j < size; ++j) { | ||
| 677 | - cov(0, counter) = covmat(i,j); | ||
| 678 | - ++counter; | ||
| 679 | - } | ||
| 680 | - } | ||
| 681 | - | ||
| 682 | - // Set dimension for covariance matrix column | ||
| 683 | - std::vector<int> dim; | ||
| 684 | - dim.push_back(size); | ||
| 685 | - dim.push_back(size); | ||
| 686 | - cov.dim(dim); | ||
| 687 | - | ||
| 688 | - // Append columns to table | ||
| 689 | - covmat_table.append(par); | ||
| 690 | - covmat_table.append(cov); | ||
| 691 | - | ||
| 692 | - // Set extension name | ||
| 693 | - covmat_table.extname("Covariance Matrix"); | ||
| 694 | - | ||
| 695 | - // Allocate FITS object | ||
| 696 | - GFits fits; | ||
| 697 | - | ||
| 698 | - // Append covariance matrix table to FITS object | ||
| 699 | - fits.append(covmat_table); | ||
| 700 | - | ||
| 701 | - // Save FITS file to disk | ||
| 702 | - fits.saveto(filename, true); | ||
| 703 | - | ||
| 704 | - // Close FITS object | ||
| 705 | - fits.close(); | 643 | + else { |
| 644 | + save_csv(filename); | ||
| 706 | } | 645 | } |
| 707 | 646 | ||
| 708 | // Return | 647 | // Return |
| @@ -776,3 +715,134 @@ void GObservations::likelihood::free_members(void) | @@ -776,3 +715,134 @@ void GObservations::likelihood::free_members(void) | ||
| 776 | // Return | 715 | // Return |
| 777 | return; | 716 | return; |
| 778 | } | 717 | } |
| 718 | + | ||
| 719 | + | ||
| 720 | +/***********************************************************************//** | ||
| 721 | + * @brief Save likelihood fit results into CSV file. | ||
| 722 | + * | ||
| 723 | + * @param[in] filename CSV filename. | ||
| 724 | + * | ||
| 725 | + * Saves the likelihood fit results into a CSV file. For the moment the | ||
| 726 | + * method only writes the covariance matrix. | ||
| 727 | + ***************************************************************************/ | ||
| 728 | +void GObservations::likelihood::save_csv(const GFilename& filename) const | ||
| 729 | +{ | ||
| 730 | + // Get covariance matrix | ||
| 731 | + GMatrixSparse covmat = covariance(); | ||
| 732 | + | ||
| 733 | + // Get covariance matrix row and column names | ||
| 734 | + std::vector<std::string> names = covariance_names(); | ||
| 735 | + | ||
| 736 | + // Create binary table and columns | ||
| 737 | + int size = names.size(); | ||
| 738 | + | ||
| 739 | + // Create binary table and columns | ||
| 740 | + GCsv table(size + 1, size); | ||
| 741 | + | ||
| 742 | + // Fill CSV header | ||
| 743 | + for (int i = 0; i < size; ++i) { | ||
| 744 | + table.string(0, i, names[i]); | ||
| 745 | + } | ||
| 746 | + | ||
| 747 | + // Fill CSV table | ||
| 748 | + for (int i = 0; i < size; ++i) { | ||
| 749 | + for (int j = 0; j < size; j ++) { | ||
| 750 | + table.real(i+1, j, covmat(i,j)); | ||
| 751 | + } | ||
| 752 | + } | ||
| 753 | + | ||
| 754 | + // Save CSV table | ||
| 755 | + table.save(filename, " ", true); | ||
| 756 | + | ||
| 757 | + // Return | ||
| 758 | + return; | ||
| 759 | +} | ||
| 760 | + | ||
| 761 | + | ||
| 762 | +/***********************************************************************//** | ||
| 763 | + * @brief Save likelihood fit results into FITS file. | ||
| 764 | + * | ||
| 765 | + * @param[in] filename FITS filename. | ||
| 766 | + * | ||
| 767 | + * Saves the likelihood fit results into a FITS file. For the moment the | ||
| 768 | + * method only writes the covariance matrix. | ||
| 769 | + ***************************************************************************/ | ||
| 770 | +void GObservations::likelihood::save_fits(const GFilename& filename) const | ||
| 771 | +{ | ||
| 772 | + // Get covariance matrix | ||
| 773 | + GMatrixSparse covmat = covariance(); | ||
| 774 | + | ||
| 775 | + // Get covariance matrix row and column names | ||
| 776 | + std::vector<std::string> names = covariance_names(); | ||
| 777 | + | ||
| 778 | + // Create binary table and columns | ||
| 779 | + int size = names.size(); | ||
| 780 | + | ||
| 781 | + // Create binary table and columns | ||
| 782 | + GFitsBinTable covmat_table; | ||
| 783 | + GFitsTableStringCol par("Parameters", 1, 50, size); | ||
| 784 | + GFitsTableDoubleCol cov("Covariance", 1, size*size); | ||
| 785 | + | ||
| 786 | + // Fill tables | ||
| 787 | + int counter = 0; | ||
| 788 | + for (int i = 0; i < size; ++i) { | ||
| 789 | + par(0, i) = names[i]; | ||
| 790 | + for (int j = 0; j < size; ++j) { | ||
| 791 | + cov(0, counter) = covmat(i,j); | ||
| 792 | + ++counter; | ||
| 793 | + } | ||
| 794 | + } | ||
| 795 | + | ||
| 796 | + // Set dimension for covariance matrix column | ||
| 797 | + std::vector<int> dim; | ||
| 798 | + dim.push_back(size); | ||
| 799 | + dim.push_back(size); | ||
| 800 | + cov.dim(dim); | ||
| 801 | + | ||
| 802 | + // Append columns to table | ||
| 803 | + covmat_table.append(par); | ||
| 804 | + covmat_table.append(cov); | ||
| 805 | + | ||
| 806 | + // Set extension name | ||
| 807 | + covmat_table.extname("Covariance Matrix"); | ||
| 808 | + | ||
| 809 | + // Allocate FITS object | ||
| 810 | + GFits fits; | ||
| 811 | + | ||
| 812 | + // Append covariance matrix table to FITS object | ||
| 813 | + fits.append(covmat_table); | ||
| 814 | + | ||
| 815 | + // Save FITS file to disk | ||
| 816 | + fits.saveto(filename, true); | ||
| 817 | + | ||
| 818 | + // Close FITS object | ||
| 819 | + fits.close(); | ||
| 820 | + | ||
| 821 | + // Return | ||
| 822 | + return; | ||
| 823 | +} | ||
| 824 | + | ||
| 825 | + | ||
| 826 | +/***********************************************************************//** | ||
| 827 | + * @brief Return covariance matrix row and column names | ||
| 828 | + * | ||
| 829 | + * @return Covariance matrix row and column names. | ||
| 830 | + * | ||
| 831 | + * Returns the row and column names of the covariance matrix. | ||
| 832 | + ***************************************************************************/ | ||
| 833 | +std::vector<std::string> GObservations::likelihood::covariance_names(void) const | ||
| 834 | +{ | ||
| 835 | + // Initialise covariance matrix row and column names | ||
| 836 | + std::vector<std::string> names; | ||
| 837 | + | ||
| 838 | + // Create covariance matrix row and column names | ||
| 839 | + for (int i = 0 ; i < m_this->m_models.size(); ++i) { | ||
| 840 | + for (int j = 0; j < m_this->m_models[i]->size(); ++j) { | ||
| 841 | + names.push_back(m_this->m_models[i]->at(j).name() + "(" + | ||
| 842 | + m_this->m_models[i]->name() + ")"); | ||
| 843 | + } | ||
| 844 | + } | ||
| 845 | + | ||
| 846 | + // Return covariance matrix row and column names | ||
| 847 | + return names; | ||
| 848 | +} |
src/support/GFilename.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * GFilename.cpp - Filename class * | 2 | * GFilename.cpp - Filename class * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2015-2016 by Juergen Knoedlseder * | 4 | + * copyright (C) 2015-2017 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 * |
| @@ -248,6 +248,61 @@ bool GFilename::exists(void) const | @@ -248,6 +248,61 @@ bool GFilename::exists(void) const | ||
| 248 | 248 | ||
| 249 | 249 | ||
| 250 | /***********************************************************************//** | 250 | /***********************************************************************//** |
| 251 | + * @brief Return file type | ||
| 252 | + * | ||
| 253 | + * @return File type. | ||
| 254 | + * | ||
| 255 | + * Returns the file type based on the file extension name. Possible file | ||
| 256 | + * types are | ||
| 257 | + * | ||
| 258 | + * Type Extension names | ||
| 259 | + * fits .fits / .fit | ||
| 260 | + * | ||
| 261 | + * For any other file types an empty string will be returned. Any compression | ||
| 262 | + * extensions such as `.gz`, `.Z`, `.z` or `.zip` will be stripped. | ||
| 263 | + ***************************************************************************/ | ||
| 264 | +std::string GFilename::type(void) const | ||
| 265 | +{ | ||
| 266 | + // Initialise empty file type | ||
| 267 | + std::string type = ""; | ||
| 268 | + | ||
| 269 | + // Initialise type with the name of the file | ||
| 270 | + std::string file = m_file; | ||
| 271 | + | ||
| 272 | + // Strip compression extensions | ||
| 273 | + size_t start = file.rfind(".gz"); | ||
| 274 | + if (start != std::string::npos) { | ||
| 275 | + file = file.substr(0, start); | ||
| 276 | + } | ||
| 277 | + start = file.rfind(".Z"); | ||
| 278 | + if (start != std::string::npos) { | ||
| 279 | + file = file.substr(0, start); | ||
| 280 | + } | ||
| 281 | + start = file.rfind(".z"); | ||
| 282 | + if (start != std::string::npos) { | ||
| 283 | + file = file.substr(0, start); | ||
| 284 | + } | ||
| 285 | + start = file.rfind(".zip"); | ||
| 286 | + if (start != std::string::npos) { | ||
| 287 | + file = file.substr(0, start); | ||
| 288 | + } | ||
| 289 | + | ||
| 290 | + // Extract file type | ||
| 291 | + start = file.rfind(".fits"); | ||
| 292 | + if (start != std::string::npos) { | ||
| 293 | + type = "fits"; | ||
| 294 | + } | ||
| 295 | + start = file.rfind(".fit"); | ||
| 296 | + if (start != std::string::npos) { | ||
| 297 | + type = "fits"; | ||
| 298 | + } | ||
| 299 | + | ||
| 300 | + // Return file type | ||
| 301 | + return type; | ||
| 302 | +} | ||
| 303 | + | ||
| 304 | + | ||
| 305 | +/***********************************************************************//** | ||
| 251 | * @brief Checks whether file is a FITS file | 306 | * @brief Checks whether file is a FITS file |
| 252 | * | 307 | * |
| 253 | * @return True if file is a FITS file. | 308 | * @return True if file is a FITS file. |
test/test_GObservation.cpp
| @@ -55,14 +55,24 @@ void TestGObservation::set(void) | @@ -55,14 +55,24 @@ void TestGObservation::set(void) | ||
| 55 | name("Observation module"); | 55 | name("Observation module"); |
| 56 | 56 | ||
| 57 | // Append tests | 57 | // Append tests |
| 58 | - append(static_cast<pfunction>(&TestGObservation::test_time_reference), "Test GTimeReference class"); | ||
| 59 | - append(static_cast<pfunction>(&TestGObservation::test_time), "Test GTime class"); | ||
| 60 | - append(static_cast<pfunction>(&TestGObservation::test_times), "Test GTimes class"); | ||
| 61 | - append(static_cast<pfunction>(&TestGObservation::test_gti), "Test GGti class"); | ||
| 62 | - append(static_cast<pfunction>(&TestGObservation::test_energy), "Test GEnergy class"); | ||
| 63 | - append(static_cast<pfunction>(&TestGObservation::test_energies), "Test GEnergies class"); | ||
| 64 | - append(static_cast<pfunction>(&TestGObservation::test_ebounds), "Test GEbounds class"); | ||
| 65 | - append(static_cast<pfunction>(&TestGObservation::test_photons), "Test GPhotons class"); | 58 | + append(static_cast<pfunction>(&TestGObservation::test_time_reference), |
| 59 | + "Test GTimeReference class"); | ||
| 60 | + append(static_cast<pfunction>(&TestGObservation::test_time), | ||
| 61 | + "Test GTime class"); | ||
| 62 | + append(static_cast<pfunction>(&TestGObservation::test_times), | ||
| 63 | + "Test GTimes class"); | ||
| 64 | + append(static_cast<pfunction>(&TestGObservation::test_gti), | ||
| 65 | + "Test GGti class"); | ||
| 66 | + append(static_cast<pfunction>(&TestGObservation::test_energy), | ||
| 67 | + "Test GEnergy class"); | ||
| 68 | + append(static_cast<pfunction>(&TestGObservation::test_energies), | ||
| 69 | + "Test GEnergies class"); | ||
| 70 | + append(static_cast<pfunction>(&TestGObservation::test_ebounds), | ||
| 71 | + "Test GEbounds class"); | ||
| 72 | + append(static_cast<pfunction>(&TestGObservation::test_photons), | ||
| 73 | + "Test GPhotons class"); | ||
| 74 | + append(static_cast<pfunction>(&TestGObservation::test_observations_optimizer), | ||
| 75 | + "Test GObservations::likelihood class"); | ||
| 66 | 76 | ||
| 67 | // Return | 77 | // Return |
| 68 | return; | 78 | return; |
| @@ -1262,6 +1272,112 @@ void TestGObservation::test_photons(void) | @@ -1262,6 +1272,112 @@ void TestGObservation::test_photons(void) | ||
| 1262 | } | 1272 | } |
| 1263 | 1273 | ||
| 1264 | 1274 | ||
| 1275 | +/***********************************************************************//** | ||
| 1276 | + * @brief Test GObservations::likelihood | ||
| 1277 | + ***************************************************************************/ | ||
| 1278 | +void TestGObservation::test_observations_optimizer(void) | ||
| 1279 | +{ | ||
| 1280 | + // Create Test Model | ||
| 1281 | + GTestModelData model; | ||
| 1282 | + | ||
| 1283 | + // Create Models conteners | ||
| 1284 | + GModels models; | ||
| 1285 | + models.append(model); | ||
| 1286 | + | ||
| 1287 | + // Time iterval | ||
| 1288 | + GTime tmin(0.0); | ||
| 1289 | + GTime tmax(1800.0); | ||
| 1290 | + | ||
| 1291 | + // Rate : events/sec | ||
| 1292 | + double rate = RATE; | ||
| 1293 | + | ||
| 1294 | + // Create observations | ||
| 1295 | + GObservations obs; | ||
| 1296 | + | ||
| 1297 | + // Add observations to container | ||
| 1298 | + for (int i = 0; i < 6; ++i) { | ||
| 1299 | + | ||
| 1300 | + // Set random Generator | ||
| 1301 | + GRan ran(i); | ||
| 1302 | + | ||
| 1303 | + // Create an event list | ||
| 1304 | + GEvents *events = model.generateList(rate, tmin, tmax, ran); | ||
| 1305 | + | ||
| 1306 | + // Create a observation | ||
| 1307 | + GTestObservation observation; | ||
| 1308 | + observation.id(gammalib::str(i)); | ||
| 1309 | + | ||
| 1310 | + // Add events to the observation | ||
| 1311 | + observation.events(*events); | ||
| 1312 | + observation.ontime(tmax.secs()-tmin.secs()); | ||
| 1313 | + | ||
| 1314 | + // Append observation to container | ||
| 1315 | + obs.append(observation); | ||
| 1316 | + | ||
| 1317 | + // Free the event list | ||
| 1318 | + delete events; | ||
| 1319 | + | ||
| 1320 | + } // endfor: added observations to container | ||
| 1321 | + | ||
| 1322 | + // Add the model to the observation | ||
| 1323 | + obs.models(models); | ||
| 1324 | + | ||
| 1325 | + // Create a GLog for show the interations of optimizer. | ||
| 1326 | + GLog log; | ||
| 1327 | + | ||
| 1328 | + // Create an optimizer. | ||
| 1329 | + GOptimizerLM opt(&log); | ||
| 1330 | + | ||
| 1331 | + // Set number of stalls | ||
| 1332 | + opt.max_stalls(50); | ||
| 1333 | + | ||
| 1334 | + // Optimize | ||
| 1335 | + obs.optimize(opt); | ||
| 1336 | + | ||
| 1337 | + // Compute errors | ||
| 1338 | + obs.errors(opt); | ||
| 1339 | + | ||
| 1340 | + // Get the result | ||
| 1341 | + GModelPar result = (*(obs.models()[0]))[0]; | ||
| 1342 | + | ||
| 1343 | + // Check if converged | ||
| 1344 | + test_value(opt.status(), 0, "Check if converged", | ||
| 1345 | + "Optimizer did not converge"); | ||
| 1346 | + | ||
| 1347 | + // Check if value is correct | ||
| 1348 | + test_value(result.factor_value(), RATE, result.factor_error()*3.0); | ||
| 1349 | + | ||
| 1350 | + // Save covariance matrix as FITS file | ||
| 1351 | + obs.function().save("test_observations_optimizer.fits"); | ||
| 1352 | + | ||
| 1353 | + // Try loading covariance matrix as FITS file | ||
| 1354 | + test_try("Load covariance matrix as FITS file"); | ||
| 1355 | + try { | ||
| 1356 | + GFits file("test_observations_optimizer.fits"); | ||
| 1357 | + test_try_success(); | ||
| 1358 | + } | ||
| 1359 | + catch (std::exception &e) { | ||
| 1360 | + test_try_failure(e); | ||
| 1361 | + } | ||
| 1362 | + | ||
| 1363 | + // Save covariance matrix as CSV file | ||
| 1364 | + obs.function().save("test_observations_optimizer.csv"); | ||
| 1365 | + | ||
| 1366 | + // Try loading covariance matrix as CSV file | ||
| 1367 | + test_try("Load covariance matrix as CSV file"); | ||
| 1368 | + try { | ||
| 1369 | + GCsv file("test_observations_optimizer.csv"); | ||
| 1370 | + test_try_success(); | ||
| 1371 | + } | ||
| 1372 | + catch (std::exception &e) { | ||
| 1373 | + test_try_failure(e); | ||
| 1374 | + } | ||
| 1375 | + | ||
| 1376 | + // Return | ||
| 1377 | + return; | ||
| 1378 | +} | ||
| 1379 | + | ||
| 1380 | + | ||
| 1265 | #ifdef _OPENMP | 1381 | #ifdef _OPENMP |
| 1266 | /***********************************************************************//** | 1382 | /***********************************************************************//** |
| 1267 | * @brief Set tests | 1383 | * @brief Set tests |
| @@ -1363,6 +1479,7 @@ void TestOpenMP::test_observations_optimizer(const int& mode) | @@ -1363,6 +1479,7 @@ void TestOpenMP::test_observations_optimizer(const int& mode) | ||
| 1363 | // Create an optimizer. | 1479 | // Create an optimizer. |
| 1364 | GOptimizerLM opt(&log); | 1480 | GOptimizerLM opt(&log); |
| 1365 | 1481 | ||
| 1482 | + // Set number of stalls | ||
| 1366 | opt.max_stalls(50); | 1483 | opt.max_stalls(50); |
| 1367 | 1484 | ||
| 1368 | // Optimize | 1485 | // Optimize |
test/test_GObservation.hpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * test_GObservation.hpp - Test observation module * | 2 | * test_GObservation.hpp - Test observation module * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2012-2014 by Jean-Baptiste Cayrou * | 4 | + * copyright (C) 2012-2017 by Jean-Baptiste Cayrou * |
| 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 * |
| @@ -55,6 +55,7 @@ public: | @@ -55,6 +55,7 @@ public: | ||
| 55 | void test_times(void); | 55 | void test_times(void); |
| 56 | void test_energy(void); | 56 | void test_energy(void); |
| 57 | void test_energies(void); | 57 | void test_energies(void); |
| 58 | + void test_observations_optimizer(void); | ||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | 61 |
test/test_GSupport.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * test_GSupport.cpp - test support module * | 2 | * test_GSupport.cpp - test support module * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2016 by Juergen Knoedlseder * | 4 | + * copyright (C) 2010-2017 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 * |
| @@ -710,31 +710,21 @@ void TestGSupport::test_filename(void) | @@ -710,31 +710,21 @@ void TestGSupport::test_filename(void) | ||
| 710 | 710 | ||
| 711 | // Set filename without extension | 711 | // Set filename without extension |
| 712 | GFilename filename = "myfile.fits"; | 712 | GFilename filename = "myfile.fits"; |
| 713 | - test_assert(filename.url() == "myfile.fits", | ||
| 714 | - "Expected \"myfile.fits\" filename, " | ||
| 715 | - "found \""+filename.url()+"\""); | 713 | + test_value(filename.url(), "myfile.fits"); |
| 716 | test_assert(!filename.has_extname(), | 714 | test_assert(!filename.has_extname(), |
| 717 | "Expected that extension name is not set."); | 715 | "Expected that extension name is not set."); |
| 718 | 716 | ||
| 719 | // Set filename with extension name | 717 | // Set filename with extension name |
| 720 | filename = "myfile.fits[EVENTS]"; | 718 | filename = "myfile.fits[EVENTS]"; |
| 721 | - test_assert(filename.url() == "myfile.fits", | ||
| 722 | - "Expected \"myfile.fits\" filename, " | ||
| 723 | - "found \""+filename.url()+"\""); | ||
| 724 | - test_assert(filename.extname() == "EVENTS", | ||
| 725 | - "Expected \"EVENTS\" extension name, " | ||
| 726 | - "found \""+filename.extname()+"\""); | 719 | + test_value(filename.url(), "myfile.fits"); |
| 720 | + test_value(filename.extname(), "EVENTS"); | ||
| 727 | test_assert(filename.has_extname(), | 721 | test_assert(filename.has_extname(), |
| 728 | "Expected that extension name is set."); | 722 | "Expected that extension name is set."); |
| 729 | 723 | ||
| 730 | // Set filename with extension name and version | 724 | // Set filename with extension name and version |
| 731 | filename = "myfile.fits[EVENTS,2]"; | 725 | filename = "myfile.fits[EVENTS,2]"; |
| 732 | - test_assert(filename.url() == "myfile.fits", | ||
| 733 | - "Expected \"myfile.fits\" filename, " | ||
| 734 | - "found \""+filename.url()+"\""); | ||
| 735 | - test_assert(filename.extname() == "EVENTS", | ||
| 736 | - "Expected \"EVENTS\" extension name, " | ||
| 737 | - "found \""+filename.extname()+"\""); | 726 | + test_value(filename.url(), "myfile.fits"); |
| 727 | + test_value(filename.extname(), "EVENTS"); | ||
| 738 | test_assert(filename.has_extname(), | 728 | test_assert(filename.has_extname(), |
| 739 | "Expected that extension name is set."); | 729 | "Expected that extension name is set."); |
| 740 | test_value(filename.extver(), 2); | 730 | test_value(filename.extver(), 2); |
| @@ -743,21 +733,15 @@ void TestGSupport::test_filename(void) | @@ -743,21 +733,15 @@ void TestGSupport::test_filename(void) | ||
| 743 | 733 | ||
| 744 | // Set filename with lower case extension name | 734 | // Set filename with lower case extension name |
| 745 | filename = "myfile.fits[events]"; | 735 | filename = "myfile.fits[events]"; |
| 746 | - test_assert(filename.extname() == "EVENTS", | ||
| 747 | - "Expected \"EVENTS\" extension name, " | ||
| 748 | - "found \""+filename.extname()+"\""); | 736 | + test_value(filename.extname(), "EVENTS"); |
| 749 | 737 | ||
| 750 | // Set filename with number in extension name | 738 | // Set filename with number in extension name |
| 751 | filename = "myfile.fits[EVENTS_2D]"; | 739 | filename = "myfile.fits[EVENTS_2D]"; |
| 752 | - test_assert(filename.extname() == "EVENTS_2D", | ||
| 753 | - "Expected \"EVENTS_2D\" extension name, " | ||
| 754 | - "found \""+filename.extname()+"\""); | 740 | + test_value(filename.extname(), "EVENTS_2D"); |
| 755 | 741 | ||
| 756 | // Set filename with extension number and version | 742 | // Set filename with extension number and version |
| 757 | filename = "myfile.fits[1,2]"; | 743 | filename = "myfile.fits[1,2]"; |
| 758 | - test_assert(filename.url() == "myfile.fits", | ||
| 759 | - "Expected \"myfile.fits\" filename, " | ||
| 760 | - "found \""+filename.url()+"\""); | 744 | + test_value(filename.url(), "myfile.fits"); |
| 761 | test_value(filename.extno(), 1); | 745 | test_value(filename.extno(), 1); |
| 762 | test_assert(filename.has_extno(), | 746 | test_assert(filename.has_extno(), |
| 763 | "Expected that extension number is set."); | 747 | "Expected that extension number is set."); |
| @@ -767,15 +751,9 @@ void TestGSupport::test_filename(void) | @@ -767,15 +751,9 @@ void TestGSupport::test_filename(void) | ||
| 767 | 751 | ||
| 768 | // Set filename with extension name and expression | 752 | // Set filename with extension name and expression |
| 769 | filename = "myfile.fits[EVENTS][ENERGY>0.1]"; | 753 | filename = "myfile.fits[EVENTS][ENERGY>0.1]"; |
| 770 | - test_assert(filename.url() == "myfile.fits", | ||
| 771 | - "Expected \"myfile.fits\" filename, " | ||
| 772 | - "found \""+filename.url()+"\""); | ||
| 773 | - test_assert(filename.extname() == "EVENTS", | ||
| 774 | - "Expected \"EVENTS\" extension name, " | ||
| 775 | - "found \""+filename.extname()+"\""); | ||
| 776 | - test_assert(filename.expression() == "ENERGY>0.1", | ||
| 777 | - "Expected \"EVENTS>0.1\" expression, " | ||
| 778 | - "found \""+filename.expression()+"\""); | 754 | + test_value(filename.url(), "myfile.fits"); |
| 755 | + test_value(filename.extname(), "EVENTS"); | ||
| 756 | + test_value(filename.expression(), "ENERGY>0.1"); | ||
| 779 | 757 | ||
| 780 | // Test missing closing symbol | 758 | // Test missing closing symbol |
| 781 | test_try("Missing ] symbol"); | 759 | test_try("Missing ] symbol"); |
| @@ -854,13 +832,9 @@ void TestGSupport::test_filename(void) | @@ -854,13 +832,9 @@ void TestGSupport::test_filename(void) | ||
| 854 | 832 | ||
| 855 | // Test default extension name | 833 | // Test default extension name |
| 856 | filename = "myfile.fits"; | 834 | filename = "myfile.fits"; |
| 857 | - test_assert(filename.extname("EVENTS") == "EVENTS", | ||
| 858 | - "Expected \"EVENTS\" extension name, " | ||
| 859 | - "found \""+filename.extname()+"\""); | 835 | + test_value(filename.extname("EVENTS"), "EVENTS"); |
| 860 | filename = "myfile.fits[LUCKY]"; | 836 | filename = "myfile.fits[LUCKY]"; |
| 861 | - test_assert(filename.extname("EVENTS") == "LUCKY", | ||
| 862 | - "Expected \"LUCKY\" extension name, " | ||
| 863 | - "found \""+filename.extname()+"\""); | 837 | + test_value(filename.extname("EVENTS"), "LUCKY"); |
| 864 | 838 | ||
| 865 | // Test default extension number | 839 | // Test default extension number |
| 866 | filename = "myfile.fits"; | 840 | filename = "myfile.fits"; |
| @@ -874,6 +848,24 @@ void TestGSupport::test_filename(void) | @@ -874,6 +848,24 @@ void TestGSupport::test_filename(void) | ||
| 874 | filename = "myfile.fits[3,3]"; | 848 | filename = "myfile.fits[3,3]"; |
| 875 | test_value(filename.extver(1), 3); | 849 | test_value(filename.extver(1), 3); |
| 876 | 850 | ||
| 851 | + // Test type method | ||
| 852 | + filename = "myfile.fits"; | ||
| 853 | + test_value(filename.type(), "fits"); | ||
| 854 | + filename = "myfile.fit"; | ||
| 855 | + test_value(filename.type(), "fits"); | ||
| 856 | + filename = "myfile.fits.gz"; | ||
| 857 | + test_value(filename.type(), "fits"); | ||
| 858 | + filename = "myfile.fits.Z"; | ||
| 859 | + test_value(filename.type(), "fits"); | ||
| 860 | + filename = "myfile.fits.z"; | ||
| 861 | + test_value(filename.type(), "fits"); | ||
| 862 | + filename = "myfile.fits.zip"; | ||
| 863 | + test_value(filename.type(), "fits"); | ||
| 864 | + filename = "myfile.csv"; | ||
| 865 | + test_value(filename.type(), ""); | ||
| 866 | + filename = "myfile.csv.gz"; | ||
| 867 | + test_value(filename.type(), ""); | ||
| 868 | + | ||
| 877 | // Return | 869 | // Return |
| 878 | return; | 870 | return; |
| 879 | } | 871 | } |