From cacfe07ce798720fd9c951573c2efa338d8a8d7b Mon Sep 17 00:00:00 2001 From: Jürgen Knödlseder Date: Tue, 19 Nov 2013 00:21:19 +0100 Subject: [PATCH] Add support for general GModelData simulations. --- ChangeLog | 5 +++-- NEWS | 6 +++++- src/ctobssim/ctobssim.cpp | 69 ++++++++++++++++++++++++++++++++++++++------------------------------- test/data/model_background_cube.xml | 13 +++++++++++++ test/data/test_cube.fits | Bin 0 -> 66240 bytes test/test_ctools.sh | 23 +++++++++++++++++++++++ 6 files changed, 82 insertions(+), 34 deletions(-) create mode 100644 test/data/model_background_cube.xml create mode 100644 test/data/test_cube.fits diff --git a/ChangeLog b/ChangeLog index 9307318..07cf961 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,11 @@ -2013-04-09 Juergen Knoedlseder +2013-11-19 Juergen Knoedlseder * Version 0.7.0 released ======================== Adapt to GammaLib-00-08-00 interface - ctobssim now only simulates events within ROI + ctobssim now only simulates events within ROI and supports + all kinds of data space models 2012-12-21 Juergen Knoedlseder diff --git a/NEWS b/NEWS index d50e85c..0f1e26a 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,7 @@ New Features and Important Changes in ctools 00-07-00 Author(s) : Juergen Knoedlseder -April 9th, 2013 +19 November 2013 1. Introduction @@ -33,6 +33,10 @@ ra and dec) and region radius (parameter rad). A margin of 0.5 has been added internally to the radius so that also sources at the edge but slightly outside of the ROI will be simulated correctly. +ctobssim now supports any kind of data space model for background +simulations, using the abstract mc() method that is now available +in the GModelData base class. + 5. ctselect - CTA event selection --------------------------------- diff --git a/src/ctobssim/ctobssim.cpp b/src/ctobssim/ctobssim.cpp index 5313c5a..84cf9f0 100644 --- a/src/ctobssim/ctobssim.cpp +++ b/src/ctobssim/ctobssim.cpp @@ -872,49 +872,56 @@ void ctobssim::simulate_background(GCTAObservation* obs, // Loop over all models for (int i = 0; i < models.size(); ++i) { - // Get model (NULL if not a radial acceptance model) - const GCTAModelRadialAcceptance* model = - dynamic_cast(models[i]); + // Get data model (NULL if not a data model) + const GModelData* model = + dynamic_cast(models[i]); - // If we have a radial acceptance model then simulate events - if (model != NULL) { + // If we have a data model that applies to CTA then simulate + // events + if (model != NULL && model->isvalid("CTA", "")) { - // Get simulated event list. Note that this method includes - // the deadtime correction. - GCTAEventList* list = model->mc(*obs, ran); + // Get simulated CTA event list. Note that this method + // includes the deadtime correction. + GCTAEventList* list = + dynamic_cast(model->mc(*obs, ran)); - // Reserves space for events - events->reserve(list->size()+events->size()); + // Continue only if we got a CTA event list + if (list != NULL) { - // Append events - for (int k = 0; k < list->size(); k++) { + // Reserves space for events + events->reserve(list->size()+events->size()); - // Get event pointer - GCTAEventAtom* event = (*list)[k]; + // Append events + for (int k = 0; k < list->size(); k++) { - // Use event only if it falls within ROI - if (event->dir().dist_deg(events->roi().centre().dir()) <= - events->roi().radius()) { + // Get event pointer + GCTAEventAtom* event = (*list)[k]; - // Set event identifier - event->event_id(m_event_id); - m_event_id++; + // Use event only if it falls within ROI + if (event->dir().dist_deg(events->roi().centre().dir()) <= + events->roi().radius()) { - // Append event - events->append(*event); + // Set event identifier + event->event_id(m_event_id); + m_event_id++; - } // endif: event was within ROI + // Append event + events->append(*event); - } // endfor: looped over all events + } // endif: event was within ROI - // Dump simulation results - if (logNormal()) { - *wrklog << gammalib::parformat("MC background events"); - *wrklog << list->size() << std::endl; - } + } // endfor: looped over all events + + // Dump simulation results + if (logNormal()) { + *wrklog << gammalib::parformat("MC background events"); + *wrklog << list->size() << std::endl; + } + + // Free event list + delete list; - // Free event list - delete list; + } // endif: we had a CTA event list } // endif: model was valid diff --git a/test/data/model_background_cube.xml b/test/data/model_background_cube.xml new file mode 100644 index 0000000..fb3342a --- /dev/null +++ b/test/data/model_background_cube.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/data/test_cube.fits b/test/data/test_cube.fits new file mode 100644 index 0000000..0d7988d Binary files /dev/null and b/test/data/test_cube.fits differ diff --git a/test/test_ctools.sh b/test/test_ctools.sh index 92f5362..15e3498 100755 --- a/test/test_ctools.sh +++ b/test/test_ctools.sh @@ -61,6 +61,8 @@ export PFILES=pfiles # Test ctobssim # ============= $ECHO -n "Test ctobssim: " +# +# Run 1 $ctobssim infile="data/crab.xml" \ outfile="events.fits" \ caldb="irf" \ @@ -80,6 +82,27 @@ else echo " events.fits file is not valid" exit 1 fi +# +# Run 2 +$ctobssim infile="data/model_background_cube.xml" \ + outfile="events2.fits" \ + caldb="irf" \ + irf="cta_dummy_irf" \ + ra=84.17263 \ + dec=22.01444 \ + rad=1.0 \ + tmin=0.0 \ + tmax=1800.0 \ + emin=0.1 \ + emax=100.0 +$ECHO -n "." +if [ -s "events2.fits" ] +then + $ECHO -n "." +else + echo " events2.fits file is not valid" + exit 1 +fi $ECHO " ok" -- libgit2 0.21.4