Commit e53da543e35aa4ed0bada135f98bd0c4277fbc9f
1 parent
2d011293
Fix OpenMP issue in ctbin when using energy bounds from file (#2912).
Showing
1 changed file
with
64 additions
and
51 deletions
src/support/ctool.cpp
| @@ -589,65 +589,78 @@ GEbounds ctool::create_ebounds(void) | @@ -589,65 +589,78 @@ GEbounds ctool::create_ebounds(void) | ||
| 589 | // If no extension name was provided then use default extension names | 589 | // If no extension name was provided then use default extension names |
| 590 | if (!ebinfile.has_extname()) { | 590 | if (!ebinfile.has_extname()) { |
| 591 | 591 | ||
| 592 | - // Open energy boundary file using the EBOUNDS or ENERGYBINS | ||
| 593 | - // extension or energy values using the ENERGIES extension. | ||
| 594 | - // Throw an exception if opening fails. | ||
| 595 | - GFits file(ebinfile.url()); | ||
| 596 | - if (file.contains(gammalib::extname_ebounds)) { | ||
| 597 | - file.close(); | ||
| 598 | - ebounds.load(ebinfile); | ||
| 599 | - } | ||
| 600 | - else if (file.contains("ENERGYBINS")) { | ||
| 601 | - file.close(); | ||
| 602 | - ebinfile = ebinfile.url() + "[ENERGYBINS]"; | ||
| 603 | - ebounds.load(ebinfile); | ||
| 604 | - } | ||
| 605 | - else if (file.contains(gammalib::extname_energies)) { | ||
| 606 | - file.close(); | ||
| 607 | - ebounds.set(GEnergies(ebinfile)); | ||
| 608 | - } | ||
| 609 | - else { | ||
| 610 | - file.close(); | ||
| 611 | - std::string msg = "No extension with name \""+ | ||
| 612 | - gammalib::extname_ebounds+"\", " | ||
| 613 | - "\"ENERGYBINS\" or \""+ | ||
| 614 | - gammalib::extname_energies+"\" found in FITS " | ||
| 615 | - "file \""+ebinfile+"\". Please specify a " | ||
| 616 | - "valid energy binning file."; | ||
| 617 | - throw GException::invalid_value(G_CREATE_EBOUNDS, msg); | ||
| 618 | - } | ||
| 619 | - } | 592 | + // Make loading of energy boundaries OpenMP thread save |
| 593 | + #pragma omp critical(ctool_create_ebounds1) | ||
| 594 | + { | ||
| 595 | + | ||
| 596 | + // Open energy boundary file using the EBOUNDS or ENERGYBINS | ||
| 597 | + // extension or energy values using the ENERGIES extension. | ||
| 598 | + // Throw an exception if opening fails. | ||
| 599 | + GFits file(ebinfile.url()); | ||
| 600 | + if (file.contains(gammalib::extname_ebounds)) { | ||
| 601 | + file.close(); | ||
| 602 | + ebounds.load(ebinfile); | ||
| 603 | + } | ||
| 604 | + else if (file.contains("ENERGYBINS")) { | ||
| 605 | + file.close(); | ||
| 606 | + ebinfile = ebinfile.url() + "[ENERGYBINS]"; | ||
| 607 | + ebounds.load(ebinfile); | ||
| 608 | + } | ||
| 609 | + else if (file.contains(gammalib::extname_energies)) { | ||
| 610 | + file.close(); | ||
| 611 | + ebounds.set(GEnergies(ebinfile)); | ||
| 612 | + } | ||
| 613 | + else { | ||
| 614 | + file.close(); | ||
| 615 | + std::string msg = "No extension with name \""+ | ||
| 616 | + gammalib::extname_ebounds+"\", " | ||
| 617 | + "\"ENERGYBINS\" or \""+ | ||
| 618 | + gammalib::extname_energies+"\" found in FITS " | ||
| 619 | + "file \""+ebinfile+"\". Please specify a " | ||
| 620 | + "valid energy binning file."; | ||
| 621 | + throw GException::invalid_value(G_CREATE_EBOUNDS, msg); | ||
| 622 | + } | ||
| 623 | + | ||
| 624 | + } // end: omp critical section | ||
| 625 | + | ||
| 626 | + } // endif: no extension name specified | ||
| 620 | 627 | ||
| 621 | // ... otherwise load energy boundaries from filename including | 628 | // ... otherwise load energy boundaries from filename including |
| 622 | // extension | 629 | // extension |
| 623 | else { | 630 | else { |
| 624 | 631 | ||
| 625 | - // Open energy boundary file | ||
| 626 | - GFits file(ebinfile.url()); | 632 | + // Make loading of energy boundaries OpenMP thread save |
| 633 | + #pragma omp critical(ctool_create_ebounds2) | ||
| 634 | + { | ||
| 635 | + | ||
| 636 | + // Open energy boundary file | ||
| 637 | + GFits file(ebinfile.url()); | ||
| 638 | + | ||
| 639 | + // If FITS file does not contain requested extension then throw | ||
| 640 | + // an exception | ||
| 641 | + if (!file.contains(ebinfile.extname())) { | ||
| 642 | + std::string msg = "No extension \""+ebinfile.extname()+"\" " | ||
| 643 | + "found in energy binning file \""+ | ||
| 644 | + ebinfile.url()+"\". Please provide a valid " | ||
| 645 | + "extension name."; | ||
| 646 | + throw GException::invalid_value(G_CREATE_EBOUNDS, msg); | ||
| 647 | + } | ||
| 627 | 648 | ||
| 628 | - // If FITS file does not contain requested extension then throw | ||
| 629 | - // an exception | ||
| 630 | - if (!file.contains(ebinfile.extname())) { | ||
| 631 | - std::string msg = "No extension \""+ebinfile.extname()+"\" " | ||
| 632 | - "found in energy binning file \""+ | ||
| 633 | - ebinfile.url()+"\". Please provide a valid " | ||
| 634 | - "extension name."; | ||
| 635 | - throw GException::invalid_value(G_CREATE_EBOUNDS, msg); | ||
| 636 | - } | 649 | + // Get table extension |
| 650 | + GFitsTable& table = *file.table(ebinfile.extname()); | ||
| 637 | 651 | ||
| 638 | - // Get table extension | ||
| 639 | - GFitsTable& table = *file.table(ebinfile.extname()); | 652 | + // If table contains one column then load energies, otherwise load |
| 653 | + // energy boundaries. | ||
| 654 | + if (table.ncols() == 1) { | ||
| 655 | + file.close(); | ||
| 656 | + ebounds.set(GEnergies(ebinfile)); | ||
| 657 | + } | ||
| 658 | + else { | ||
| 659 | + file.close(); | ||
| 660 | + ebounds.load(ebinfile); | ||
| 661 | + } | ||
| 640 | 662 | ||
| 641 | - // If table contains one column then load energies, otherwise load | ||
| 642 | - // energy boundaries. | ||
| 643 | - if (table.ncols() == 1) { | ||
| 644 | - file.close(); | ||
| 645 | - ebounds.set(GEnergies(ebinfile)); | ||
| 646 | - } | ||
| 647 | - else { | ||
| 648 | - file.close(); | ||
| 649 | - ebounds.load(ebinfile); | ||
| 650 | - } | 663 | + } // end: omp critical section |
| 651 | 664 | ||
| 652 | } // endelse: loaded energy boundaries from table extension | 665 | } // endelse: loaded energy boundaries from table extension |
| 653 | 666 |