Commit c4c9029b3dfdd2eadc031b753f67974e6294dba0

Authored by Jürgen Knödlseder
1 parent 68896b27

Add #pragma omp critical in ctfindvar::get_alphas and exclude all low count time…

… bins in ctfindvar::get_variability_sig before entering the iterative loop (#2804)
Showing 1 changed file with 23 additions and 22 deletions
src/ctfindvar/ctfindvar.cpp
1 /*************************************************************************** 1 /***************************************************************************
2 * ctfindvar - Time variability search tool * 2 * ctfindvar - Time variability search tool *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2018 by Simon Bonnefoy * 4 + * copyright (C) 2018-2019 by Simon Bonnefoy *
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 *
@@ -229,7 +229,7 @@ void ctfindvar::run(void) @@ -229,7 +229,7 @@ void ctfindvar::run(void)
229 if (logDebug()) { 229 if (logDebug()) {
230 log.cout(true); 230 log.cout(true);
231 } 231 }
232 - 232 +
233 // Get task parameters 233 // Get task parameters
234 get_parameters(); 234 get_parameters();
235 235
@@ -544,7 +544,7 @@ void ctfindvar::init_gtis(void) @@ -544,7 +544,7 @@ void ctfindvar::init_gtis(void)
544 // Set up Good Time Intervals by appending all intervals that overlap 544 // Set up Good Time Intervals by appending all intervals that overlap
545 // with at least one of the observations 545 // with at least one of the observations
546 for (int i = 0; i < bins; ++i) { 546 for (int i = 0; i < bins; ++i) {
547 - 547 +
548 // Get time interval 548 // Get time interval
549 GTime tstart(m_tstart + i*tinterval); 549 GTime tstart(m_tstart + i*tinterval);
550 GTime tstop(m_tstart + (i+1.0)*tinterval); 550 GTime tstop(m_tstart + (i+1.0)*tinterval);
@@ -810,7 +810,7 @@ void ctfindvar::analyse_cube(void) @@ -810,7 +810,7 @@ void ctfindvar::analyse_cube(void)
810 m_model_above_thr.append(sky_model(dir_pix)); 810 m_model_above_thr.append(sky_model(dir_pix));
811 } 811 }
812 } 812 }
813 - 813 +
814 } // endfor: looped over pixels 814 } // endfor: looped over pixels
815 815
816 // Log results 816 // Log results
@@ -872,7 +872,7 @@ std::vector&lt;int&gt; ctfindvar::get_pixels(void) @@ -872,7 +872,7 @@ std::vector&lt;int&gt; ctfindvar::get_pixels(void)
872 } // endfor: looped over all models 872 } // endfor: looped over all models
873 873
874 } // endif: there were input models 874 } // endif: there were input models
875 - 875 +
876 // ... otherwise query the source position 876 // ... otherwise query the source position
877 else { 877 else {
878 878
@@ -917,7 +917,7 @@ GModelSky ctfindvar::sky_model(const GSkyDir&amp; dir) const @@ -917,7 +917,7 @@ GModelSky ctfindvar::sky_model(const GSkyDir&amp; dir) const
917 917
918 // Create a sky model 918 // Create a sky model
919 GModelSky model(spatial, spectral); 919 GModelSky model(spatial, spectral);
920 - 920 +
921 // Build model name from celestial coordinates 921 // Build model name from celestial coordinates
922 double ra = dir.ra_deg(); 922 double ra = dir.ra_deg();
923 double dec = dir.dec_deg(); 923 double dec = dir.dec_deg();
@@ -960,6 +960,14 @@ GNdarray ctfindvar::get_variability_sig(const int&amp; ipix) @@ -960,6 +960,14 @@ GNdarray ctfindvar::get_variability_sig(const int&amp; ipix)
960 // Get alpha values for specified pixel 960 // Get alpha values for specified pixel
961 std::vector<double> alphas = get_alphas(ipix); 961 std::vector<double> alphas = get_alphas(ipix);
962 962
  963 + // Exclude all bins from the background estimate for which the
  964 + // number of events is below "minoff" or for which alpha is zero
  965 + for (int i = 0; i < m_gti.size(); ++i) {
  966 + if (m_counts(ipix, i) < m_minoff || alphas[i] == 0.0) {
  967 + accepted_bin_bckg_vector[i] = false;
  968 + }
  969 + }
  970 +
963 // Loop over pixels until all background pixels are removed 971 // Loop over pixels until all background pixels are removed
964 bool background_validated = false; 972 bool background_validated = false;
965 while (background_validated == false) { 973 while (background_validated == false) {
@@ -970,26 +978,18 @@ GNdarray ctfindvar::get_variability_sig(const int&amp; ipix) @@ -970,26 +978,18 @@ GNdarray ctfindvar::get_variability_sig(const int&amp; ipix)
970 // Loop over all the GTIs of the pixel 978 // Loop over all the GTIs of the pixel
971 for (int i = 0; i < m_gti.size(); ++i) { 979 for (int i = 0; i < m_gti.size(); ++i) {
972 980
973 - // The GTI is discared from background calculation and not 981 + // The GTI is discarded from background calculation and not
974 // checked again 982 // checked again
975 if (!accepted_bin_bckg_vector[i]) { 983 if (!accepted_bin_bckg_vector[i]) {
976 continue; 984 continue;
977 } 985 }
978 986
979 - // ... otherwise check if bin fails minoff check or no observations  
980 - // overlap it  
981 - else if (m_counts(ipix, i) < m_minoff || alphas[i] == 0) {  
982 - accepted_bin_bckg_vector[i] = false;  
983 - continue;  
984 - }  
985 -  
986 - // ... otherwise 987 + // ... otherwise GTI is selected, and we loop over all the
  988 + // others
987 double noff = 0.0; 989 double noff = 0.0;
988 double alpha = 0.0; 990 double alpha = 0.0;
989 -  
990 - // Got one GTI selected (i), looping over all the others (j).  
991 for (int j = 0; j < m_gti.size(); ++j) { 991 for (int j = 0; j < m_gti.size(); ++j) {
992 - if (j != i && accepted_bin_bckg_vector[j] == 1) { 992 + if (j != i && accepted_bin_bckg_vector[j]) {
993 noff += m_counts(ipix, j); 993 noff += m_counts(ipix, j);
994 alpha += alphas[j]; 994 alpha += alphas[j];
995 } 995 }
@@ -1019,7 +1019,7 @@ GNdarray ctfindvar::get_variability_sig(const int&amp; ipix) @@ -1019,7 +1019,7 @@ GNdarray ctfindvar::get_variability_sig(const int&amp; ipix)
1019 } 1019 }
1020 sig *= (non < alpha*noff) ? -1.0 : 1.0; 1020 sig *= (non < alpha*noff) ? -1.0 : 1.0;
1021 } 1021 }
1022 - 1022 +
1023 // Update the significance 1023 // Update the significance
1024 sig_histogram(i) = sig; 1024 sig_histogram(i) = sig;
1025 1025
@@ -1071,7 +1071,7 @@ std::vector&lt;double&gt; ctfindvar::get_alphas(const int&amp; ipix) const @@ -1071,7 +1071,7 @@ std::vector&lt;double&gt; ctfindvar::get_alphas(const int&amp; ipix) const
1071 if (roi_centre.dist_deg(pix_dir) > roi.radius()) { 1071 if (roi_centre.dist_deg(pix_dir) > roi.radius()) {
1072 continue; 1072 continue;
1073 } 1073 }
1074 - 1074 +
1075 // Convert sky direction to instrument direction 1075 // Convert sky direction to instrument direction
1076 GCTAInstDir instdir = obs->pointing().instdir(pix_dir); 1076 GCTAInstDir instdir = obs->pointing().instdir(pix_dir);
1077 1077
@@ -1113,6 +1113,7 @@ std::vector&lt;double&gt; ctfindvar::get_alphas(const int&amp; ipix) const @@ -1113,6 +1113,7 @@ std::vector&lt;double&gt; ctfindvar::get_alphas(const int&amp; ipix) const
1113 } 1113 }
1114 1114
1115 // Add up background rate 1115 // Add up background rate
  1116 + #pragma omp critical(ctfindvar_get_alphas)
1116 alphas[j] += exposure * bkg->rate_ebin(instdir, m_emin, m_emax); 1117 alphas[j] += exposure * bkg->rate_ebin(instdir, m_emin, m_emax);
1117 1118
1118 } // endif: exposure was positive 1119 } // endif: exposure was positive
@@ -1186,7 +1187,7 @@ GTime ctfindvar::get_tstart(void) @@ -1186,7 +1187,7 @@ GTime ctfindvar::get_tstart(void)
1186 1187
1187 // Get CTA observation 1188 // Get CTA observation
1188 GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[k]); 1189 GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[k]);
1189 - 1190 +
1190 // Continue only if observation is valid 1191 // Continue only if observation is valid
1191 if (obs != NULL) { 1192 if (obs != NULL) {
1192 1193
@@ -1239,7 +1240,7 @@ GTime ctfindvar::get_tstop(void) @@ -1239,7 +1240,7 @@ GTime ctfindvar::get_tstop(void)
1239 1240
1240 // Get CTA observation 1241 // Get CTA observation
1241 GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[k]); 1242 GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs[k]);
1242 - 1243 +
1243 // Continue only if observation is valid 1244 // Continue only if observation is valid
1244 if (obs != NULL) { 1245 if (obs != NULL) {
1245 1246