Bug #1450

ctselect doesn't allow observations with zero events

Added by Mayer Michael almost 10 years ago. Updated over 9 years ago.

Status:ClosedStart date:03/25/2015
Priority:NormalDue date:
Assigned To:Mayer Michael% Done:

100%

Category:-
Target version:1.0.0
Duration:

Description

Using ctselect with the ethres=DEFAULT parameter, results in an observation list with various energy ranges. This works fine.
If one however subsequently runs ctselect with a small energy range, where only few runs contribute with events, an exception is thrown:

*** ERROR in GEbounds::insert_eng(int&, GEnergy&, GEnergy&): Invalid argument. Invalid energy interval specified. Minimum energy 607.552 GeV can not be larger than maximum energy 200 GeV.
*** ERROR encounterted in the execution of ctselect. Run aborted ...

This can be reproduced by running csspec on with a larger energy range than the actual preselected observations.
The problem occurs in ctselect::set_ebounds(). At the end of this function, we create GEbounds with emin and emax. If e.g. emin was adjusted to match previous cuts it may happen that emin>emax leading to the above exception while creating the ebounds.
My suggestion is to add a check when creating the ebounds:

    // Set selection energy boundaries
    GEbounds result;

    if (emin > emax) {
        result.append(GEnergy(emin,"TeV"), GEnergy(emin,"TeV"));
    }
    else {
        result.append(GEnergy(emin, "TeV"), GEnergy(emax, "TeV"));
    }

    // Return result
    return result;
 

Note that in case emin>emax, we could use a GEbounds with [emin, emin]. This circumvents the exception and assures the selection of zero events. This zero energy range also allows to predict zero events, e.g. for ctmodel, etc.

However, on the gammalib-level, an exception is then thrown:

*** ERROR encounterted in the execution of ctlike. Run aborted ...
*** ERROR in GObservation::npred_spec(GModel&, GTime&): Invalid energy range (Emin=0 MeV, Emax=0 MeV) specified.

This can easily be fixed by allowing emin=emax in GObservation::npred_spec(). Accordingly, we could change if(emin<=emax) to if(emin<emax) in GObservation::npred_spec(). I guess allowing npred=0 in case the energy width is 0.0 makes more sense anyway


Recurrence

No recurrence.

History

#1 Updated by Mayer Michael almost 10 years ago

  • Status changed from New to Pull request
  • Assigned To set to Mayer Michael
  • Target version set to 1.0.0
  • % Done changed from 0 to 100

Fix is available on branch adjust-ctselect-to-allow-runs-without-events in ctools (forgot to add the issue number). On the gammalib-level, in line 1394 of GObservation.cpp<=” just has to be changed to ”<”.

#2 Updated by Knödlseder Jürgen almost 10 years ago

I’m wondering whether all this is very clean, or whether it would be better in ctselect::set_ebounds() to just return an empty energy boundaries object, hence

    // Set selection energy boundaries
    GEbounds result;
    if (emax > emin) {
        result.append(GEnergy(emin, "TeV"), GEnergy(emax, "TeV"));
    }

    // Return result
    return result;

In GObservation::npred_spec would could then change the code to simply return 0 if no energy boundaries exist. But maybe there are further implications.

#3 Updated by Mayer Michael over 9 years ago

This should do it, too. I agree the other method was a bit dirty. I quickly ran make check which also did not throw an error.

#4 Updated by Mayer Michael over 9 years ago

I was wondering if it was even cleaner to remove the observation from the container? But nevertheless, I also think that returning an empty GEbounds-object should be sufficient. Could you make the changes?

#5 Updated by Knödlseder Jürgen over 9 years ago

  • Status changed from Pull request to Closed

I made the changes and merged the code into devel.

Also available in: Atom PDF