GRmf.hpp 13.8 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
/***************************************************************************
 *            GRmf.hpp - XSPEC Redistribution Matrix File class            *
 * ----------------------------------------------------------------------- *
 *  copyright (C) 2013-2018 by Juergen Knoedlseder                         *
 * ----------------------------------------------------------------------- *
 *                                                                         *
 *  This program is free software: you can redistribute it and/or modify   *
 *  it under the terms of the GNU General Public License as published by   *
 *  the Free Software Foundation, either version 3 of the License, or      *
 *  (at your option) any later version.                                    *
 *                                                                         *
 *  This program is distributed in the hope that it will be useful,        *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
 *  GNU General Public License for more details.                           *
 *                                                                         *
 *  You should have received a copy of the GNU General Public License      *
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.  *
 *                                                                         *
 ***************************************************************************/
/**
 * @file GRmf.hpp
 * @brief XSPEC Redistribution Matrix File class definition
 * @author Juergen Knoedlseder
 */

#ifndef GRMF_HPP
#define GRMF_HPP

/* __ Includes ___________________________________________________________ */
#include <string>
#include "GBase.hpp"
#include "GFilename.hpp"
#include "GEbounds.hpp"
#include "GMatrixSparse.hpp"
#include "GFitsHeader.hpp"

/* __ Forward declarations _______________________________________________ */
class GFits;
class GFitsTable;

/* __ Constants __________________________________________________________ */
namespace gammalib {
    const std::string extname_rmf = "MATRIX";
}


/***********************************************************************//**
 * @class GRmf
 *
 * @brief Redistribution Matrix File class
 *
 * Matrix rows are true energy, columns are channels
 ***************************************************************************/
class GRmf : public GBase {

    // Operator friends
    friend GRmf operator+(const GRmf& a,       const GRmf& b);
    friend GRmf operator-(const GRmf& a,       const GRmf& b);
    friend GRmf operator*(const GRmf& rmf,     const double& scale);
    friend GRmf operator*(const double& scale, const GRmf& rmf);
    friend GRmf operator/(const GRmf& rmf,     const double& scale);

public:
    // Constructors and destructors
    GRmf(void);
    explicit GRmf(const GFilename& filename);
    GRmf(const GEbounds& etrue, const GEbounds& emeasured);
    GRmf(const GRmf& rmf);
    virtual ~GRmf(void);

    // Operators
    GRmf&         operator=(const GRmf& rmf);
    GRmf&         operator+=(const GRmf& rmf);
    GRmf&         operator-=(const GRmf& rmf);
    GRmf&         operator*=(const double& scale);
    GRmf&         operator/=(const double& scale);
    double&       operator()(const int& itrue, const int& imeasured);
    const double& operator()(const int& itrue, const int& imeasured) const;

    // Methods
    void                 clear(void);
    GRmf*                clone(void) const;
    std::string          classname(void) const;
    int                  size(void) const;
    int                  ntrue(void) const;
    int                  nmeasured(void) const;
    int                  itruemax(void) const;
    int                  imeasmax(void) const;
    double&              at(const int& itrue, const int& imeasured);
    const double&        at(const int& itrue, const int& imeasured) const;
    const GEbounds&      etrue(void) const;
    const GEbounds&      emeasured(void) const;
    GEbounds             etrue(const GEnergy& emeasured) const;
    GEbounds             emeasured(const GEnergy& etrue) const;
    const GMatrixSparse& matrix(void) const;
    void                 load(const GFilename& filename);
    void                 save(const GFilename&   filename,
                              const bool&        clobber = false,
                              const std::string& unit = "keV") const;
    void                 read(const GFits& fits);
    void                 read(const GFitsTable& table);
    void                 write(GFits& fits,
                               const std::string& unit = "keV") const;
    const GFilename&     filename(void) const;
    const GFitsHeader&   header(void) const;
    void                 header(const GFitsHeader& header);
    std::string          print(const GChatter& chatter = NORMAL) const;

protected:
    // Protected methods
    void   init_members(void);
    void   copy_members(const GRmf& rmf);
    void   free_members(void);
    
    // Protected members
    mutable GFilename m_filename;      //!< Filename of origin
    GEbounds          m_ebds_true;     //!< True energy boundaries
    GEbounds          m_ebds_measured; //!< Measured energy boundaries
    GMatrixSparse     m_matrix;        //!< Sparse redistribution matrix
    int               m_imeasmax;      //!< Index of measured maximum
    int               m_itruemax;      //!< Index of true maximum
    GFitsHeader       m_header;        //!< FITS header cards
};


/***********************************************************************//**
 * @brief Return class name
 *
 * @return String containing the class name ("GRmf").
 ***************************************************************************/
inline
std::string GRmf::classname(void) const
{
    return ("GRmf");
}


/***********************************************************************//**
 * @brief Return content of redistribution matrix bin
 *
 * @param[in] itrue True energy index [0,...,ntrue()-1].
 * @param[in] imeasured Measured energy index [0,...,nmeasured()-1].
 *
 * Returns reference to content of redistribution matrix bin bin with true
 * energy index @p itrue and measured energy index @p imeasured.
 ***************************************************************************/
inline
double& GRmf::operator()(const int& itrue, const int& imeasured)
{
    return (m_matrix(itrue, imeasured));
}


/***********************************************************************//**
 * @brief Return content of redistribution matrix bin (const version)
 *
 * @param[in] itrue True energy index [0,...,ntrue()-1].
 * @param[in] imeasured Measured energy index [0,...,nmeasured()-1].
 *
 * Returns reference to content of redistribution matrix bin bin with true
 * energy index @p itrue and measured energy index @p imeasured.
 ***************************************************************************/
inline
const double& GRmf::operator()(const int& itrue, const int& imeasured) const
{
    return (m_matrix(itrue, imeasured));
}


/***********************************************************************//**
 * @brief Return number of redistribution matrix bins
 *
 * @return Number of redistribution matrix bins.
 *
 * Returns the number of redistribution matrix bins.
 ***************************************************************************/
inline
int GRmf::size(void) const
{
    return (m_matrix.rows()*m_matrix.columns());
}


/***********************************************************************//**
 * @brief Return number of true energy bins in redistribution matrix
 *
 * @return Number true energy bins in redistribution matrix.
 *
 * Returns the number of true energy bins in redistribution matrix.
 ***************************************************************************/
inline
int GRmf::ntrue(void) const
{
    return (m_matrix.rows());
}


/***********************************************************************//**
 * @brief Return number of measured energy bins in redistribution matrix
 *
 * @return Number measured energy bins in redistribution matrix.
 *
 * Returns the number of measured energy bins in redistribution matrix.
 ***************************************************************************/
inline
int GRmf::nmeasured(void) const
{
    return (m_matrix.columns());
}




/***********************************************************************//**
 * @brief Return true energy index of maximum value of the redistribution matrix
 *
 * @return True energy index of maximum value of the redistribution matrix.
 *
 * Returns the true energy index of maximum value of the redistribution matrix.
 ***************************************************************************/
inline
int GRmf::itruemax(void) const
{
    return m_itruemax;
}


/***********************************************************************//**
 * @brief Return measured energy index of maximum value of the redistribution matrix
 *
 * @return Measured energy index of maximum value of the redistribution matrix.
 *
 * Returns the measured energy index of maximum value of the redistribution matrix.
 ***************************************************************************/
inline
int GRmf::imeasmax(void) const
{
    return m_imeasmax;
}


/***********************************************************************//**
 * @brief Return true energy boundaries
 *
 * @return True energy boundaries for redistribution matrix.
 *
 * Returns the true energy boundaries for redistribution matrix.
 ***************************************************************************/
inline
const GEbounds& GRmf::etrue(void) const
{
    return m_ebds_true;
}


/***********************************************************************//**
 * @brief Return measured energy boundaries
 *
 * @return Measured energy boundaries for redistribution matrix.
 *
 * Returns the measured energy boundaries for redistribution matrix.
 ***************************************************************************/
inline
const GEbounds& GRmf::emeasured(void) const
{
    return m_ebds_measured;
}


/***********************************************************************//**
 * @brief Return redistribution matrix
 *
 * @return Redistribution matrix.
 ***************************************************************************/
inline
const GMatrixSparse& GRmf::matrix(void) const
{
    return m_matrix;
}


/***********************************************************************//**
 * @brief Return file name
 *
 * @return File name from which the RMF information has been read or into
 *         which RMF information has been saved.
 *
 * Returns the file name from which the RMF information has been read or into
 * which RMF information has been saved. The returned string will be empty if
 * no load() or save() method has been called before.
 ***************************************************************************/
inline
const GFilename& GRmf::filename(void) const
{
    return (m_filename);
}


/***********************************************************************//**
 * @brief Return FITS header
 *
 * @return FITS header or RMF file.
 ***************************************************************************/
inline
const GFitsHeader& GRmf::header(void) const
{
    return (m_header);
}


/***********************************************************************//**
 * @brief Set FITS header
 *
 * @param[in] header FITS header.
 ***************************************************************************/
inline
void GRmf::header(const GFitsHeader& header)
{
    m_header = header;
    return;
}


/***********************************************************************//**
 * @brief Redistribution Matrix File addition operator friend
 *
 * @param[in] a First Redistribution Matrix File.
 * @param[in] b Second Redistribution Matrix File.
 * @return Sum of Redistribution Matrix Files.
 ***************************************************************************/
inline
GRmf operator+(const GRmf& a, const GRmf& b)
{
    GRmf result = a;
    result     += b;
    return result;
}


/***********************************************************************//**
 * @brief Redistribution Matrix File subtraction operator friend
 *
 * @param[in] a First Redistribution Matrix File.
 * @param[in] b Second Redistribution Matrix File.
 * @return Difference of Redistribution Matrix Files.
 ***************************************************************************/
inline
GRmf operator-(const GRmf& a, const GRmf& b)
{
    GRmf result = a;
    result     -= b;
    return result;
}


/***********************************************************************//**
 * @brief Redistribution Matrix File scaling operator friend
 *
 * @param[in] rmf Redistribution Matrix File.
 * @param[in] scale Scale factor.
 * @return Scaled Redistribution Matrix File.
 ***************************************************************************/
inline
GRmf operator*(const GRmf& rmf, const double& scale)
{
    GRmf result = rmf;
    result     *= scale;
    return result;
}


/***********************************************************************//**
 * @brief Redistribution Matrix File scaling operator friend
 *
 * @param[in] scale Scale factor.
 * @param[in] rmf Redistribution Matrix File.
 * @return Scaled Redistribution Matrix File.
 ***************************************************************************/
inline
GRmf operator*(const double& scale, const GRmf& rmf)
{
    GRmf result = rmf;
    result     *= scale;
    return result;
}


/***********************************************************************//**
 * @brief Redistribution Matrix File vision operator friend
 *
 * @param[in] rmf Redistribution Matrix File.
 * @param[in] scale Division factor.
 * @return Divided Redistribution Matrix File.
 ***************************************************************************/
inline
GRmf operator/(const GRmf& rmf, const double& scale)
{
    GRmf result = rmf;
    result     /= scale;
    return result;
}

#endif /* GRMF_HPP */