Commit bd585ba9693962677f47f5006e4fe51761c74aed

Authored by Jürgen Knödlseder
1 parent 86d4c073

Add maxrate parameter to throw an exception in case that the source event rate is too high (#807).

doc/source/reference_manual/ctobssim.rst
... ... @@ -9,9 +9,9 @@ Simulates CTA events.
9 9 Synopsis
10 10 --------
11 11  
12   -Generate photon events from astrophysical sources and process those photons
13   -according to the specified instrument response functions and generate
14   -instrumental background events.
  12 +Generate photon events from astrophysical sources and background events
  13 +from an instrumental background model.
  14 +
15 15  
16 16 General parameters
17 17 ------------------
... ... @@ -24,7 +24,7 @@ General parameters
24 24  
25 25 ``inmodel [file]``
26 26 XML file that describes the astrophysical sources and the instrumental
27   - background.
  27 + background model.
28 28  
29 29 ``outevents [file]``
30 30 Output event list or observation definition XML file.
... ... @@ -39,7 +39,10 @@ General parameters
39 39 Instrumental response function.
40 40  
41 41 ``(seed = 1) [integer]``
42   - Integer seed value to be used for Monte Carlo simulations.
  42 + Integer seed value to be used for Monte Carlo simulations. Keep this
  43 + parameter at the same value for repeatable simulations, or increment
  44 + this value for subsequent runs if non-repeatable simulations are
  45 + required.
43 46  
44 47 ``ra [real]``
45 48 Right Ascension of CTA pointing (J2000, in degrees).
... ... @@ -57,10 +60,10 @@ General parameters
57 60 Mission elapsed stop time of observation (in seconds).
58 61  
59 62 ``emin [real]``
60   - Lower energy limit of events (in TeV).
  63 + Lower energy limit of simulated events (in TeV).
61 64  
62 65 ``emax [real]``
63   - Upper energy limit of events (in TeV).
  66 + Upper energy limit of simulated events (in TeV).
64 67  
65 68 ``(edisp = no) [boolean]``
66 69 Apply energy dispersion?
... ... @@ -68,6 +71,13 @@ General parameters
68 71 ``(deadc = 0.95) [real]``
69 72 Average deadtime correction factor.
70 73  
  74 +``(maxrate = 1.0e6) [real]``
  75 + Maximum photon rate for source models. Source models that exceed this
  76 + maximum photon rate will lead to an exception as very likely the
  77 + specified model normalisation is too large (probably due to the
  78 + a misinterpretation of units). Note that ctools specifies intensity
  79 + units per MeV.
  80 +
71 81  
72 82 Standard parameters
73 83 -------------------
... ...
pyext/ctobssim.i
1 1 /***************************************************************************
2 2 * ctobssim - Observation simulator tool *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright (C) 2011-2014 by Juergen Knoedlseder *
  4 + * copyright (C) 2011-2015 by Juergen Knoedlseder *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software: you can redistribute it and/or modify *
... ... @@ -48,6 +48,8 @@ public:
48 48 void run(void);
49 49 void save(void);
50 50 const GObservations& obs(void) const;
  51 + const double& max_rate(void) const;
  52 + void max_rate(const double& max_rate);
51 53 };
52 54  
53 55  
... ...
src/ctobssim/ctobssim.cpp
... ... @@ -494,6 +494,7 @@ void ctobssim::init_members(void)
494 494 m_prefix.clear();
495 495 m_seed = 1;
496 496 m_apply_edisp = false;
  497 + m_max_rate = 1.0e6;
497 498  
498 499 // Initialise protected members
499 500 m_rans.clear();
... ... @@ -524,6 +525,7 @@ void ctobssim::copy_members(const ctobssim& app)
524 525 m_prefix = app.m_prefix;
525 526 m_seed = app.m_seed;
526 527 m_apply_edisp = app.m_apply_edisp;
  528 + m_max_rate = app.m_max_rate;
527 529  
528 530 // Copy protected members
529 531 m_area = app.m_area;
... ... @@ -577,6 +579,7 @@ void ctobssim::get_parameters(void)
577 579 // Get other parameters
578 580 m_seed = (*this)["seed"].integer();
579 581 m_apply_edisp = (*this)["edisp"].boolean();
  582 + m_max_rate = (*this)["maxrate"].real();
580 583  
581 584 // Optionally read ahead parameters so that they get correctly
582 585 // dumped into the log file
... ... @@ -768,6 +771,36 @@ void ctobssim::simulate_source(GCTAObservation* obs, const GModels& models,
768 771 }
769 772 GTime tslice(duration, "sec");
770 773  
  774 + // If photon rate exceeds the maximum photon rate
  775 + // then throw an exception
  776 + if (rate > m_max_rate) {
  777 + std::string modnam = (model->name().length() > 0) ?
  778 + model->name() : "Unknown";
  779 + std::string msg = "Photon rate "+
  780 + gammalib::str(rate)+
  781 + " photons/sec for model \""+
  782 + modnam+"\" exceeds maximum"
  783 + " allowed photon rate of "+
  784 + gammalib::str(m_max_rate)+
  785 + " photons/sec. Please check"
  786 + " the model parameters for"
  787 + " model \""+modnam+"\" or"
  788 + " increase the value of the"
  789 + " hidden \"maxrate\""
  790 + " parameter.";
  791 + throw GException::invalid_value(G_SIMULATE_SOURCE, msg);
  792 + }
  793 +
  794 + // Dump length of time slice and rate
  795 + if (logExplicit()) {
  796 + *wrklog << gammalib::parformat("Photon rate", indent);
  797 + *wrklog << rate << " photons/sec";
  798 + if (model->name().length() > 0) {
  799 + *wrklog << " [" << model->name() << "]";
  800 + }
  801 + *wrklog << std::endl;
  802 + }
  803 +
771 804 // To reduce memory requirements we split long time
772 805 // intervals into several slices.
773 806 GTime tstart = tmin;
... ... @@ -795,6 +828,10 @@ void ctobssim::simulate_source(GCTAObservation* obs, const GModels&amp; models,
795 828 *wrklog << " - ";
796 829 *wrklog << tstop.convert(m_cta_ref);
797 830 *wrklog << " s" << std::endl;
  831 + if (model->name().length() > 0) {
  832 + *wrklog << " [" << model->name() << "]";
  833 + }
  834 + *wrklog << std::endl;
798 835 }
799 836  
800 837 // Get photons
... ...
src/ctobssim/ctobssim.hpp
... ... @@ -66,6 +66,8 @@ public:
66 66 void run(void);
67 67 void save(void);
68 68 const GObservations& obs(void) const;
  69 + const double& max_rate(void) const;
  70 + void max_rate(const double& max_rate);
69 71  
70 72 protected:
71 73 // Protected methods
... ... @@ -95,6 +97,7 @@ protected:
95 97 mutable bool m_save_and_dispose; //!< Save and dispose immediately
96 98 double m_area; //!< Surface area for simulation (cm2)
97 99 int m_max_photons; //!< Maximum number of photons/slice
  100 + double m_max_rate; //!< Maximum photon rate
98 101 std::vector<GRan> m_rans; //!< Random number generators
99 102 int m_event_id; //!< Event identifier
100 103 };
... ... @@ -108,7 +111,32 @@ protected:
108 111 inline
109 112 const GObservations& ctobssim::obs(void) const
110 113 {
111   - return m_obs;
  114 + return (m_obs);
  115 +}
  116 +
  117 +
  118 +/***********************************************************************//**
  119 + * @brief Return maximum photon rate
  120 + *
  121 + * @return Reference to maximum photon rate.
  122 + ***************************************************************************/
  123 +inline
  124 +const double& ctobssim::max_rate(void) const
  125 +{
  126 + return (m_max_rate);
  127 +}
  128 +
  129 +
  130 +/***********************************************************************//**
  131 + * @brief Set maximum photon rate
  132 + *
  133 + * @param[in] max_rate Maximum photon rate.
  134 + ***************************************************************************/
  135 +inline
  136 +void ctobssim::max_rate(const double& max_rate)
  137 +{
  138 + m_max_rate = max_rate;
  139 + return;
112 140 }
113 141  
114 142 #endif /* CTOBSSIM_HPP */
... ...
src/ctobssim/ctobssim.par
... ... @@ -29,16 +29,17 @@ irf, s, a, &quot;cta_dummy_irf&quot;,,, &quot;Instrument response function&quot;
29 29 #
30 30 # Simulation parameters
31 31 #======================
32   -seed, i, h, 1,,, "Random number generator seed"
33   -ra, r, a, 83.63,0,360, "RA of pointing (degrees)"
34   -dec, r, a, 22.01,-90,90, "Dec of pointing (degrees)"
35   -rad, r, a, 5.0,0,180, "Radius of FOV (degrees)"
36   -tmin, r, a, 0.0,,, "Start time (MET in s)"
37   -tmax, r, a, 1800.0,,, "End time (MET in s)"
38   -emin, r, a, 0.1,,, "Lower energy limit (TeV)"
39   -emax, r, a, 100.0,,, "Upper energy limit (TeV)"
40   -edisp, b, h, no,,, "Apply energy dispersion?"
41   -deadc, r, h, 0.95,0,1, "Average deadtime correction factor"
  32 +seed, i, h, 1,,, "Random number generator seed"
  33 +ra, r, a, 83.63,0,360, "RA of pointing (degrees)"
  34 +dec, r, a, 22.01,-90,90, "Dec of pointing (degrees)"
  35 +rad, r, a, 5.0,0,180, "Radius of FOV (degrees)"
  36 +tmin, r, a, 0.0,,, "Start time (MET in s)"
  37 +tmax, r, a, 1800.0,,, "End time (MET in s)"
  38 +emin, r, a, 0.1,,, "Lower energy limit (TeV)"
  39 +emax, r, a, 100.0,,, "Upper energy limit (TeV)"
  40 +edisp, b, h, no,,, "Apply energy dispersion?"
  41 +deadc, r, h, 0.95,0,1, "Average deadtime correction factor"
  42 +maxrate, r, h, 1.0e6,,, "Maximum photon rate"
42 43 #
43 44 # Standard parameters
44 45 #====================
... ...