Commit 0aed83aabcc9619711008a5d2028853c8e26a3b1
1 parent
8c02499b
Correctly compute model for stacked analysis (fixes #1609).
Although the get_obs() method was put back, ctmodel used the dummy cube (which consisted of a single pixel) instead of a cube defined from the input parameters. This was due to an internal change of the logic, that now has been corrected for.
Showing
2 changed files
with
29 additions
and
12 deletions
src/ctmodel/ctmodel.cpp
| ... | ... | @@ -284,7 +284,7 @@ void ctmodel::run(void) |
| 284 | 284 | |
| 285 | 285 | // Fill cube and leave loop if we are binned mode (meaning we |
| 286 | 286 | // only have one binned observation) |
| 287 | - if (m_binned && m_obs.size() == 1) { | |
| 287 | + if (m_binned) { | |
| 288 | 288 | fill_cube(obs); |
| 289 | 289 | break; |
| 290 | 290 | } |
| ... | ... | @@ -464,13 +464,16 @@ void ctmodel::get_parameters(void) |
| 464 | 464 | m_append_cube = false; |
| 465 | 465 | |
| 466 | 466 | // If there are no observations in container then load them via user |
| 467 | - // parameters | |
| 467 | + // parameters. | |
| 468 | 468 | if (m_obs.size() == 0) { |
| 469 | 469 | get_obs(); |
| 470 | 470 | } |
| 471 | 471 | |
| 472 | - // Check if we got excactly one binned CTA observation | |
| 473 | - if (m_obs.size() == 1) { | |
| 472 | + // If we have now excactly one CTA observation (but no cube has yet been | |
| 473 | + // appended to the observation) then check whether this observation | |
| 474 | + // is a binned observation, and if yes, extract the counts cube for | |
| 475 | + // model generation | |
| 476 | + if ((m_obs.size() == 1) && (m_append_cube == false)) { | |
| 474 | 477 | |
| 475 | 478 | // Get CTA observation |
| 476 | 479 | GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[0]); |
| ... | ... | @@ -498,7 +501,6 @@ void ctmodel::get_parameters(void) |
| 498 | 501 | |
| 499 | 502 | } // endif: had exactly one observation |
| 500 | 503 | |
| 501 | - | |
| 502 | 504 | // Read model definition file if required |
| 503 | 505 | if (m_obs.models().size() == 0) { |
| 504 | 506 | |
| ... | ... | @@ -513,7 +515,9 @@ void ctmodel::get_parameters(void) |
| 513 | 515 | // Get energy dispersion flag parameters |
| 514 | 516 | m_apply_edisp = (*this)["edisp"].boolean(); |
| 515 | 517 | |
| 516 | - // Optionally get input counts cube for model cube definition | |
| 518 | + // If we do not have yet a counts cube for model computation then check | |
| 519 | + // whether we should read it from the "incube" parameter or whether we | |
| 520 | + // should create it from scratch using the task parameters | |
| 517 | 521 | if (!m_has_cube) { |
| 518 | 522 | |
| 519 | 523 | // Read cube definition file |
| ... | ... | @@ -544,18 +548,21 @@ void ctmodel::get_parameters(void) |
| 544 | 548 | |
| 545 | 549 | // Signal that cube has been set |
| 546 | 550 | m_has_cube = true; |
| 547 | - } | |
| 551 | + | |
| 552 | + } // endif: we had no cube yet | |
| 548 | 553 | |
| 549 | 554 | // Read optionally output cube filenames |
| 550 | 555 | if (read_ahead()) { |
| 551 | - m_outcube = (*this)["outcube"].filename(); | |
| 556 | + m_outcube = (*this)["outcube"].filename(); | |
| 552 | 557 | } |
| 553 | 558 | |
| 554 | 559 | // If cube should be appended to first observation then do that now. |
| 555 | 560 | // This is a kluge that makes sure that the cube is passed as part |
| 556 | 561 | // of the observation in case that a cube response is used. The kluge |
| 557 | 562 | // is needed because the GCTACubeSourceDiffuse::set method needs to |
| 558 | - // get the full event cube from the observation. | |
| 563 | + // get the full event cube from the observation. It is also at this | |
| 564 | + // step that the GTI, which may just be a dummy GTI when create_cube() | |
| 565 | + // has been used, will be set. | |
| 559 | 566 | if (m_append_cube) { |
| 560 | 567 | |
| 561 | 568 | //TODO: Check that energy boundaries are compatible |
| ... | ... | @@ -588,6 +595,11 @@ void ctmodel::get_parameters(void) |
| 588 | 595 | * If no file names are specified for the "expcube", "psfcube" or "bkgcube" |
| 589 | 596 | * parameters, the method reads the necessary parameters to build a CTA |
| 590 | 597 | * observation from scratch. |
| 598 | + * | |
| 599 | + * The method sets m_append_cube = true and m_binned = true in case that | |
| 600 | + * a stacked observation is requested (as detected by the presence of the | |
| 601 | + * "expcube", "psfcube", and "bkgcube" parameters). In that case, it appended | |
| 602 | + * a dummy event cube to the observation. | |
| 591 | 603 | ***************************************************************************/ |
| 592 | 604 | void ctmodel::get_obs(void) |
| 593 | 605 | { |
| ... | ... | @@ -620,7 +632,6 @@ void ctmodel::get_obs(void) |
| 620 | 632 | |
| 621 | 633 | // Create dummy sky map cube |
| 622 | 634 | GSkyMap map("CAR","GAL",0.0,0.0,1.0,1.0,1,1,ebounds.size()); |
| 623 | - m_append_cube = true; | |
| 624 | 635 | |
| 625 | 636 | // Create event cube |
| 626 | 637 | GCTAEventCube cube(map, ebounds, exposure.gti()); |
| ... | ... | @@ -633,6 +644,12 @@ void ctmodel::get_obs(void) |
| 633 | 644 | // Append observation to container |
| 634 | 645 | m_obs.append(cta); |
| 635 | 646 | |
| 647 | + // Signal that we are in binned mode | |
| 648 | + m_binned = true; | |
| 649 | + | |
| 650 | + // Signal that we appended a cube | |
| 651 | + m_append_cube = true; | |
| 652 | + | |
| 636 | 653 | } // endif: cube response information was available |
| 637 | 654 | |
| 638 | 655 | // ... otherwise build an observation from IRF response information |
| ... | ... | @@ -646,7 +663,7 @@ void ctmodel::get_obs(void) |
| 646 | 663 | |
| 647 | 664 | // Append observation to container |
| 648 | 665 | m_obs.append(cta); |
| 649 | - | |
| 666 | + | |
| 650 | 667 | } |
| 651 | 668 | |
| 652 | 669 | } // endif: filename was "NONE" or "" | ... | ... |
src/support/ctool.cpp
| ... | ... | @@ -652,7 +652,7 @@ GCTAObservation ctool::create_cta_obs(void) |
| 652 | 652 | list.gti(gti); |
| 653 | 653 | list.ebounds(ebounds); |
| 654 | 654 | |
| 655 | - // Attach event list to CTA observation | |
| 655 | + // Attach empty event list to CTA observation | |
| 656 | 656 | obs.events(list); |
| 657 | 657 | |
| 658 | 658 | // Set observation ontime, livetime and deadtime correction factor | ... | ... |