Commit 8fc4e141a422254ee4bdd05ae677d35d762d4f35

Authored by L. Tibaldo
Committed by Jürgen Knödlseder
1 parent 035428e5

Modified as per issue description

src/ctselect/ctselect.cpp
@@ -478,6 +478,7 @@ void ctselect::init_members(void) @@ -478,6 +478,7 @@ void ctselect::init_members(void)
478 m_phases.clear(); 478 m_phases.clear();
479 m_select_energy = false; 479 m_select_energy = false;
480 m_select_phase = false; 480 m_select_phase = false;
  481 + m_forcesel = false;
481 482
482 // Return 483 // Return
483 return; 484 return;
@@ -506,6 +507,7 @@ void ctselect::copy_members(const ctselect& app) @@ -506,6 +507,7 @@ void ctselect::copy_members(const ctselect& app)
506 m_phases = app.m_phases; 507 m_phases = app.m_phases;
507 m_select_energy = app.m_select_energy; 508 m_select_energy = app.m_select_energy;
508 m_select_phase = app.m_select_phase; 509 m_select_phase = app.m_select_phase;
  510 + m_forcesel = app.m_forcesel;
509 511
510 // Return 512 // Return
511 return; 513 return;
@@ -548,6 +550,9 @@ void ctselect::get_parameters(void) @@ -548,6 +550,9 @@ void ctselect::get_parameters(void)
548 // Query the RoI 550 // Query the RoI
549 GCTAPointing pnt; 551 GCTAPointing pnt;
550 GCTARoi roi = get_roi(pnt); 552 GCTARoi roi = get_roi(pnt);
  553 + // Signal whether the RoI selection should be enforced
  554 + // even when leading to invalid RoI
  555 + m_forcesel = (has_par("forcesel") && (*this)["forcesel"].boolean());
551 556
552 // Query Good Time Intervals. The GammaLib time reference is specified 557 // Query Good Time Intervals. The GammaLib time reference is specified
553 // as a dummy argument since the relevant intervals will be queried later 558 // as a dummy argument since the relevant intervals will be queried later
@@ -730,6 +735,9 @@ void ctselect::select_events(GCTAObservation* obs, @@ -730,6 +735,9 @@ void ctselect::select_events(GCTAObservation* obs,
730 // Signal that RoI selection should be performed 735 // Signal that RoI selection should be performed
731 bool select_roi = roi.is_valid(); 736 bool select_roi = roi.is_valid();
732 737
  738 + //Create boolean to remember if RoI selection is enforced regardless of its validity
  739 + bool enforced_roi = false;
  740 +
733 // Set time selection interval. We make sure here that the time selection 741 // Set time selection interval. We make sure here that the time selection
734 // interval cannot be wider than the GTIs covering the data. This is done 742 // interval cannot be wider than the GTIs covering the data. This is done
735 // using GGti's reduce() method. 743 // using GGti's reduce() method.
@@ -913,8 +921,38 @@ void ctselect::select_events(GCTAObservation* obs, @@ -913,8 +921,38 @@ void ctselect::select_events(GCTAObservation* obs,
913 GSkyDir centre; 921 GSkyDir centre;
914 centre.radec_deg(ra, dec); 922 centre.radec_deg(ra, dec);
915 double distance = centre.dist_deg(roi_centre); 923 double distance = centre.dist_deg(roi_centre);
916 - if (distance + rad > roi_radius) {  
917 - rad = roi_radius - distance; 924 + // If the requested RoI and selected RoI are centred at the same position
  925 + // and the requested RoI is bigger then the original
  926 + // keep original radius
  927 + // RoIs same centre = distance < 1.e-4
  928 + // to cope with numerical precision limitations
  929 + if (distance < 1.e-4 && rad > roi_radius) {
  930 + rad = roi_radius;
  931 + }
  932 + //Otherwise, check if requested RoI is enclosed within original RoI
  933 + else {
  934 + if (distance + rad > roi_radius) {
  935 + //If selection is enforced log warning and store
  936 + if (m_forcesel){
  937 + enforced_roi = true;
  938 + log_string(TERSE, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  939 + log_string(TERSE,"Enforced RoI selection leading to inconsistent RoI. "\
  940 + "RoI of data: Centre(RA,DEC)=("+gammalib::str(ra)+", "+
  941 + gammalib::str(dec)+") deg, Radius="+gammalib::str(rad)+
  942 + " deg. Requested RoI: Centre(RA,DEC)=("+
  943 + gammalib::str(roi_centre.ra_deg())+", "+
  944 + gammalib::str(roi_centre.dec_deg())+") deg, Radius="+
  945 + gammalib::str(roi_radius)+" deg. The resulting event list "\
  946 + "file is not usable for likelihood analysis");
  947 + log_string(TERSE, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  948 + }
  949 + // Otherwise, throw an exception
  950 + else {
  951 + std::string message;
  952 + message = "Invalid RoI selection: the new RoI must be enclosed in the original RoI";
  953 + throw GException::invalid_value(G_RUN, message);
  954 + }
  955 + }
918 } 956 }
919 } 957 }
920 958
@@ -1011,8 +1049,8 @@ void ctselect::select_events(GCTAObservation* obs, @@ -1011,8 +1049,8 @@ void ctselect::select_events(GCTAObservation* obs,
1011 // closed later 1049 // closed later
1012 list->fetch(); 1050 list->fetch();
1013 1051
1014 - // If RoI selection has been applied then set the event list RoI  
1015 - if (select_roi) { 1052 + // If RoI selection has been applied without forcing then set the event list RoI
  1053 + if (select_roi && !enforced_roi) {
1016 GCTAInstDir instdir; 1054 GCTAInstDir instdir;
1017 instdir.dir().radec_deg(ra, dec); 1055 instdir.dir().radec_deg(ra, dec);
1018 list->roi(GCTARoi(instdir, rad)); 1056 list->roi(GCTARoi(instdir, rad));
src/ctselect/ctselect.hpp
@@ -87,6 +87,7 @@ protected: @@ -87,6 +87,7 @@ protected:
87 std::string m_expr; //!< Selection expression 87 std::string m_expr; //!< Selection expression
88 std::string m_usethres; //!< Energy threshold type 88 std::string m_usethres; //!< Energy threshold type
89 GChatter m_chatter; //!< Chattiness 89 GChatter m_chatter; //!< Chattiness
  90 + bool m_forcesel; //!< Enforce RoI selection
90 91
91 // Protected members 92 // Protected members
92 std::vector<std::string> m_infiles; //!< Input event filenames 93 std::vector<std::string> m_infiles; //!< Input event filenames
src/ctselect/ctselect.par
@@ -23,10 +23,11 @@ prefix, s, h, selected_,,, &quot;Prefix for event lists in observation definition XML @@ -23,10 +23,11 @@ prefix, s, h, selected_,,, &quot;Prefix for event lists in observation definition XML
23 # 23 #
24 # Selection parameters 24 # Selection parameters
25 #===================== 25 #=====================
26 -usepnt, b, h, no,,, "Use pointing instead of RA/DEC parameters?" 26 +usepnt, b, h, yes,,, "Use pointing instead of RA/DEC parameters?"
27 ra, r, a, 83.63,0,360, "RA for ROI centre (degrees)" 27 ra, r, a, 83.63,0,360, "RA for ROI centre (degrees)"
28 dec, r, a, 22.51,-90,90, "Dec for ROI centre (degrees)" 28 dec, r, a, 22.51,-90,90, "Dec for ROI centre (degrees)"
29 -rad, r, a, 3.0,0,180, "Radius of ROI (degrees)" 29 +rad, r, a, 3.0,0,180, "Radius of ROI around pointing or specified RA/DEC (degrees)"
  30 +forcesel,b, h, no,,, "Force RoI selection even if it produces invalid RoI"
30 tmin, t, a, NONE,,, "Start time (UTC string, JD, MJD or MET in seconds)" 31 tmin, t, a, NONE,,, "Start time (UTC string, JD, MJD or MET in seconds)"
31 tmax, t, a, NONE,,, "Stop time (UTC string, JD, MJD or MET in seconds)" 32 tmax, t, a, NONE,,, "Stop time (UTC string, JD, MJD or MET in seconds)"
32 emin, r, a, 0.1,,, "Lower energy limit (TeV)" 33 emin, r, a, 0.1,,, "Lower energy limit (TeV)"