New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean up irf/io.py and add load_cta_irf function #1909

Merged
merged 13 commits into from Nov 15, 2018

Conversation

Projects
None yet
3 participants
@registerrier
Contributor

registerrier commented Nov 7, 2018

This PR is a first step in cleaning up suggested in issue #1551.

It removes all CTAPerf and associated tables in irf/io.py which are connected to sensitivity estimation with prod 2 CTA IRFs. Those will be moved in gammapy-extra.

The load_CTA_IRF helper function uses a default location for the CTA prod 3 IRF file. This might not be a good idea.
the simulate_3d.ipynb notebook is modified to use this helper function .

IS this OK @jjlk ?

@registerrier registerrier added the cleanup label Nov 7, 2018

@registerrier registerrier added this to the 0.9 milestone Nov 7, 2018

@registerrier registerrier self-assigned this Nov 7, 2018

@registerrier registerrier requested a review from cdeil Nov 7, 2018

@cdeil

@registerrier - Thanks!

Suggest to rename load_CTA_1DC_IRF to load_cta_irfs - it's not just 1DC specific. Please put a properly formatted docstring or the Sphinx build will fail. Probably this will evolve to be a flexible loader that has some format discovery and object mapping and will just load all IRFs it finds and not error out if e.g. no BKG is given like for HESS is better, no? Otherwise we'll have to write one such helper function for each IRF. OK to leave as-is for now if you want, I'm just saying.

Why did you change from class to function? Isn't the next step again a method to slice out the response for a offset, and for that having a class to attach this method to is useful? Did you want to make this another function?

I don't think the old class from Julien was bad - it was just in the wrong place gammapy.scripts and had a weird name (CTAIRFLoader or something like that would be fine IMO) and all of the other not so useful classes that mainly did plotting were things I wanted to get rid of.

Otherwise: 👍 , thanks, good to see the other code go.

Feel free to merge as-is if you like. I don't care strongly about any of these points at the moment, this is clearly a bit step in the right direction and we won't get the API right now in a one-time effort anyways.

"outputs": [
{
"data": {
"image/png": "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\n",

This comment has been minimized.

@cdeil

cdeil Nov 7, 2018

Member

@registerrier - Looks like you didn't strip the output in the notebook.

Suggest to do that in a follow-up commit, then squash the commits here to avoid introducing the PNG data into the version history of this git repo (and to have a cleaner history).
Let me know if you need help there with the git, I could try locally and then past the command to do it here.

This comment has been minimized.

@registerrier

registerrier Nov 7, 2018

Contributor

Done.

@registerrier registerrier force-pushed the registerrier:cta_simulation branch from 040b5de to 9536910 Nov 7, 2018

@registerrier

This comment has been minimized.

Contributor

registerrier commented Nov 8, 2018

I decided to turn CTAIrf into a simple function returning a dict because there was no clear use case for another usage than just loading the IRFs.

Simulations should be performed on reduced datasets. So that the most natural approach to me is extract the reduced IRFs from a (set of) fake empty observations.

@cdeil

This comment has been minimized.

Member

cdeil commented Nov 8, 2018

@registerrier - OK.

Simulations should be performed on reduced datasets. So that the most natural approach to me is extract the reduced IRFs from a (set of) fake empty observations.

You could try and see if this "just works" with https://docs.gammapy.org/0.8/api/gammapy.data.ObservationCTA.html
passing it to MapMaker.
(well, there's always some little changes needed, but I think in principle it should work)

We're not sure if we want to keep it as a second observation class, but the use case to build one from scratch and use it for simulation remains in whatever form this code takes, so 👍 to move in this direction.

@registerrier

This comment has been minimized.

Contributor

registerrier commented Nov 8, 2018

I have marked xfail the test_sensivity in gammapy/spectrum which is using CTAPerf.

The plan is to modify SensitivityEstimator to use SpectrumSimulation. This requires a number of changes, so this will go in a later PR.

@cdeil

This comment has been minimized.

Member

cdeil commented Nov 8, 2018

The plan is to modify SensitivityEstimator to use SpectrumSimulation.

What? Really? That seems odd to me.

If you want to talk, I'm available today, or we could talk tomorrow in the Gammapy call.

@registerrier

This comment has been minimized.

Contributor

registerrier commented Nov 8, 2018

There is a Travis CI fail here: https://travis-ci.org/gammapy/gammapy/jobs/452289084#L4201

It is apparently due to the impossibility to find the gammapy dataset. Note that this test is done without gammapy-extra. I thought that using data stored in $GAMMAPY_DATA would work even without gammapy-extra. Am I wrong? @Bultako @cdeil

@Bultako

This comment has been minimized.

Member

Bultako commented Nov 13, 2018

@registerrier
The config file for Travis declares the path of GAMMAPY_DATA in the following way.

gammapy/.travis.yml

Lines 167 to 169 in 52b2d07

- if $FETCH_GAMMAPY_DATA; then
export GAMMAPY_DATA=${HOME}/gammapy-extra/datasets;
fi

This is something that has to be changed and use gammapy download datasets instead. But as it is now, GAMMAPY_DATA relies on GAMMAPY_EXTRA in Travis CI.

There's some discussion about removing GAMMAPY_EXTRA env var in #1889 and use only GAMMAPY_DATA

Basically GAMMAPY_EXTRA = GAMMAPY_DATA + test_datasets/
After some thinking, I would be in favor of adding a flag to gammapy download datasets to also download test_datasets/ and replace in the code all references to GAMMAPY_EXTRA by GAMMAPY_DATA.

In the mean time, consider that Travis tests explicitly not requiring GAMMAPY_EXTRA will fail when working with data files.

@cdeil

This comment has been minimized.

Member

cdeil commented Nov 13, 2018

We still have a ton of tests that access GAMMAPY_EXTRA:

$ ack GAMMAPY_EXTRA gammapy | wc -l
106

@registerrier - Please do that for this PR.

@Bultako - I think getting rid of GAMMAPY_EXTRA for Gammapy testing isn't so simple. Probably adding gammapy download data --tests or something similar is the way to go. But we would first need to think about and be clear if test data should only accumulate forever, or if some test data files are allowed to change or be removed, in which case a version-coupling of code and tests data is needed, which we don't have for gammapy download data. Maybe the whole decision to not have version-coupling for gammapy download data to avoid unnecessary duplicated copies for multiple versions users have wasn't so great (still changing, will want to remove something in the coming years). To be discussed ...

@registerrier registerrier force-pushed the registerrier:cta_simulation branch from 2a28543 to aae781a Nov 14, 2018

but only contains IRFs (no event data or livetime info).
TODO: maybe re-factor code somehow to avoid code duplication.
The various IRFs are accessible with the following keys
'aeff' is a `~gammapy.irf.EffectiveAreaTable2D`

This comment has been minimized.

@cdeil

cdeil Nov 14, 2018

Member

This will look much better if you do a bullet list like this (empty line is needed for RST):

The various IRFs are accessible with the following keys:

- 'aeff' is a `~gammapy.irf.EffectiveAreaTable2D`
- ...

Otherwise it all appears as one wrapped paragraph in the HTML and is harder to read.

@cdeil

This comment has been minimized.

Member

cdeil commented Nov 14, 2018

@registerrier - CI passed, this is mostly ready to go in.

I would suggest to remove the default "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits"

It might be convenient now, but really it's not doing us or the users a favour. In 2019 or 2020 that file and format will be old, and there users should use newer IRF files. So in Gammapy we would want to update the default filename. But then if a user relied on the default, their script breaks or they silently get different results. -> better to remove the default IMO.

You can still mention the default in the docstring or an Examples section in the docstring of course, that is nice.

@registerrier

This comment has been minimized.

Contributor

registerrier commented Nov 15, 2018

Most issues solved. Merge now.
The cta_sensitivity.ipynb notebook fails now because CTAPerf is gone. Some adaptation to SensitivityEstimator is required to solve this. This will be done in a later PR.

@registerrier registerrier merged commit b1a42e3 into gammapy:master Nov 15, 2018

0 of 4 checks passed

Codacy/PR Quality Review Hang in there, Codacy is reviewing your Pull request.
Details
Scrutinizer Running
Details
continuous-integration/appveyor/pr Waiting for AppVeyor build to complete
Details
continuous-integration/travis-ci/pr The Travis CI build is in progress
Details

@cdeil cdeil changed the title from Cleaning of irf/io.py to introduce load_CTA_IRF helper function to Clean upirf/io.py and add load_cta_irf function Nov 23, 2018

@cdeil cdeil changed the title from Clean upirf/io.py and add load_cta_irf function to Clean up irf/io.py and add load_cta_irf function Nov 23, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment