Commit a2c378d30a852ad61daff57596a217d245e9f5ec

Authored by Jürgen Knödlseder
1 parent 4ceb2c5d

Extend OpenMP thread safeness to all methods in ctool.cpp base class (#2912)

@@ -31,8 +31,9 @@ None @@ -31,8 +31,9 @@ None
31 31
32 Base classes 32 Base classes
33 ------------ 33 ------------
34 -Make ctool::create_ebounds() OpenMP thread save so that multiple threads can  
35 -call the method and load energy boudnary FITS files (#2912). 34 +Make ctool::create_ebounds(), ctool::create_energies() and
  35 +ctool::save_event_list() methods OpenMP thread save so that multiple threads
  36 +can call the method at the same time (#2912).
36 37
37 38
38 ctbin - CTA event binning 39 ctbin - CTA event binning
configure.ac
1 ############################################################################# 1 #############################################################################
2 # Configuration for ctools - tools for science analysis of CTA data # 2 # Configuration for ctools - tools for science analysis of CTA data #
3 # ------------------------------------------------------------------------- # 3 # ------------------------------------------------------------------------- #
4 -# Copyright (C) 2011-2018 Juergen Knoedlseder # 4 +# Copyright (C) 2011-2019 Juergen Knoedlseder #
5 # ------------------------------------------------------------------------- # 5 # ------------------------------------------------------------------------- #
6 # # 6 # #
7 # This program is free software: you can redistribute it and/or modify # 7 # This program is free software: you can redistribute it and/or modify #
src/support/ctool.cpp
@@ -733,7 +733,7 @@ GEnergies ctool::create_energies(void) @@ -733,7 +733,7 @@ GEnergies ctool::create_energies(void)
733 // If no extension name was provided then use default extension names 733 // If no extension name was provided then use default extension names
734 if (!ebinfile.has_extname()) { 734 if (!ebinfile.has_extname()) {
735 735
736 - // Make loading of energy boundaries OpenMP thread save 736 + // Make loading of energies OpenMP thread save
737 #pragma omp critical(ctool_create_energies1) 737 #pragma omp critical(ctool_create_energies1)
738 { 738 {
739 739
@@ -773,7 +773,7 @@ GEnergies ctool::create_energies(void) @@ -773,7 +773,7 @@ GEnergies ctool::create_energies(void)
773 // extension 773 // extension
774 else { 774 else {
775 775
776 - // Make loading of energy boundaries OpenMP thread save 776 + // Make loading of energies OpenMP thread save
777 #pragma omp critical(ctool_create_energies2) 777 #pragma omp critical(ctool_create_energies2)
778 { 778 {
779 779
@@ -2229,34 +2229,40 @@ void ctool::save_event_list(const GCTAObservation* obs, @@ -2229,34 +2229,40 @@ void ctool::save_event_list(const GCTAObservation* obs,
2229 } 2229 }
2230 } 2230 }
2231 2231
2232 - // Create output FITS file  
2233 - GFits outfits;  
2234 -  
2235 - // Write observation into FITS file  
2236 - obs->write(outfits, outevt, outgti);  
2237 -  
2238 - // Copy all extensions other than evtname and gtiname extensions  
2239 - // from the input to the output event list. The evtname and  
2240 - // gtiname extensions are written by the save method, all others  
2241 - // that may eventually be present have to be copied over  
2242 - // explicitly.  
2243 - GFits infits(infile);  
2244 - for (int extno = 1; extno < infits.size(); ++extno) {  
2245 - GFitsHDU* hdu = infits.at(extno);  
2246 - if (hdu->extname() != evtname &&  
2247 - hdu->extname() != gtiname &&  
2248 - hdu->extname() != outevt &&  
2249 - hdu->extname() != outgti) {  
2250 - outfits.append(*hdu); 2232 + // Make writing of FITS file OpenMP thread save
  2233 + #pragma omp critical(ctool_save_event_list)
  2234 + {
  2235 +
  2236 + // Create output FITS file
  2237 + GFits outfits;
  2238 +
  2239 + // Write observation into FITS file
  2240 + obs->write(outfits, outevt, outgti);
  2241 +
  2242 + // Copy all extensions other than evtname and gtiname extensions
  2243 + // from the input to the output event list. The evtname and
  2244 + // gtiname extensions are written by the save method, all others
  2245 + // that may eventually be present have to be copied over
  2246 + // explicitly.
  2247 + GFits infits(infile);
  2248 + for (int extno = 1; extno < infits.size(); ++extno) {
  2249 + GFitsHDU* hdu = infits.at(extno);
  2250 + if (hdu->extname() != evtname &&
  2251 + hdu->extname() != gtiname &&
  2252 + hdu->extname() != outevt &&
  2253 + hdu->extname() != outgti) {
  2254 + outfits.append(*hdu);
  2255 + }
2251 } 2256 }
2252 - }  
2253 2257
2254 - // Close input file  
2255 - infits.close(); 2258 + // Close input file
  2259 + infits.close();
  2260 +
  2261 + // Save file to disk and close it (we need both operations)
  2262 + outfits.saveto(outname.url(), clobber());
  2263 + outfits.close();
2256 2264
2257 - // Save file to disk and close it (we need both operations)  
2258 - outfits.saveto(outname.url(), clobber());  
2259 - outfits.close(); 2265 + } // end: omp critical section
2260 2266
2261 } // endif: observation was unbinned 2267 } // endif: observation was unbinned
2262 2268