Commit 42ccfdb30c4258e667436f0ae3fd3a369c6e15f7
Committed by
Jürgen Knödlseder
1 parent
bf9f1f3e
Add output for significance distribution of pixel with maximum significance (#2713)
Showing
2 changed files
with
67 additions
and
27 deletions
src/ctfindvar/ctfindvar.cpp
| @@ -303,11 +303,10 @@ void ctfindvar::run(void) | @@ -303,11 +303,10 @@ void ctfindvar::run(void) | ||
| 303 | 303 | ||
| 304 | //preparing the histogram with significance evolution for the source center and the highest sig-pix | 304 | //preparing the histogram with significance evolution for the source center and the highest sig-pix |
| 305 | m_pixsigsrc = GNdarray(srcInxPix.size(), nbins); | 305 | m_pixsigsrc = GNdarray(srcInxPix.size(), nbins); |
| 306 | - m_pixsigmax = GNdarray(1,nbins); | 306 | + m_pixsigmax = GNdarray(nbins); |
| 307 | 307 | ||
| 308 | //Prepare the final skymap with the max significance of each pixel | 308 | //Prepare the final skymap with the max significance of each pixel |
| 309 | double max_sig=0; | 309 | double max_sig=0; |
| 310 | - GSkyDir max_sig_dir; | ||
| 311 | 310 | ||
| 312 | //looping over all the pixels in the cube | 311 | //looping over all the pixels in the cube |
| 313 | #pragma omp parallel for | 312 | #pragma omp parallel for |
| @@ -365,15 +364,10 @@ void ctfindvar::run(void) | @@ -365,15 +364,10 @@ void ctfindvar::run(void) | ||
| 365 | { | 364 | { |
| 366 | if (max(pixSig) > max_sig) | 365 | if (max(pixSig) > max_sig) |
| 367 | { | 366 | { |
| 368 | - max_sig = max(pixSig); | ||
| 369 | - // Store information for pixel with the maximum significance | ||
| 370 | - for (int i=0; i<nbins; i++) { | ||
| 371 | - m_pixsigmax(0,i) = pixSig(i); | ||
| 372 | - } | ||
| 373 | - | ||
| 374 | // Update the pixel position with the maximum sigma | 367 | // Update the pixel position with the maximum sigma |
| 375 | - max_sig = max(pixSig); | ||
| 376 | - max_sig_dir = m_counts.inx2dir(pix_number); | 368 | + max_sig = max(pixSig); |
| 369 | + m_max_sig_dir = m_counts.inx2dir(pix_number); | ||
| 370 | + m_pixsigmax = pixSig; | ||
| 377 | } | 371 | } |
| 378 | } | 372 | } |
| 379 | //storing sig in skymap | 373 | //storing sig in skymap |
| @@ -382,8 +376,8 @@ void ctfindvar::run(void) | @@ -382,8 +376,8 @@ void ctfindvar::run(void) | ||
| 382 | 376 | ||
| 383 | log_header1(NORMAL, "Analysis finished"); | 377 | log_header1(NORMAL, "Analysis finished"); |
| 384 | log_value(NORMAL, "Maximum sigma", max_sig); | 378 | log_value(NORMAL, "Maximum sigma", max_sig); |
| 385 | - log_value(NORMAL, "Max pixel RA", max_sig_dir.ra_deg()); | ||
| 386 | - log_value(NORMAL, "Max pixel DEC", max_sig_dir.dec_deg()); | 379 | + log_value(NORMAL, "Max pixel RA", m_max_sig_dir.ra_deg()); |
| 380 | + log_value(NORMAL, "Max pixel DEC", m_max_sig_dir.dec_deg()); | ||
| 387 | 381 | ||
| 388 | return; | 382 | return; |
| 389 | } | 383 | } |
| @@ -925,7 +919,8 @@ void ctfindvar::write_srchist(void) | @@ -925,7 +919,8 @@ void ctfindvar::write_srchist(void) | ||
| 925 | double tinterval = (*this)["tinterval"].real(); | 919 | double tinterval = (*this)["tinterval"].real(); |
| 926 | int nentries = (m_tstop-m_tstart) / tinterval + 0.5; | 920 | int nentries = (m_tstop-m_tstart) / tinterval + 0.5; |
| 927 | int nsources = m_pixsigsrc.shape()[0]; | 921 | int nsources = m_pixsigsrc.shape()[0]; |
| 928 | - GNdarray time_info(2,nentries); | 922 | + GNdarray time_info(2, nentries); |
| 923 | + GNdarray max_pixel_info(nentries); | ||
| 929 | GNdarray src_info(nsources, nentries); | 924 | GNdarray src_info(nsources, nentries); |
| 930 | 925 | ||
| 931 | // Store the full set of information | 926 | // Store the full set of information |
| @@ -949,13 +944,18 @@ void ctfindvar::write_srchist(void) | @@ -949,13 +944,18 @@ void ctfindvar::write_srchist(void) | ||
| 949 | src_info(src,i) = 0.0; | 944 | src_info(src,i) = 0.0; |
| 950 | } | 945 | } |
| 951 | } | 946 | } |
| 947 | + | ||
| 948 | + // Fill max pixel information | ||
| 949 | + if (index >= 0) { | ||
| 950 | + max_pixel_info(i) = m_pixsigmax(index); | ||
| 951 | + } | ||
| 952 | } | 952 | } |
| 953 | 953 | ||
| 954 | // Call the appropriate method for writing the data | 954 | // Call the appropriate method for writing the data |
| 955 | if ((*this)["histtype"].string() == "CSV") { | 955 | if ((*this)["histtype"].string() == "CSV") { |
| 956 | - write_srchist_csv(time_info, src_info); | 956 | + write_srchist_csv(time_info, max_pixel_info, src_info); |
| 957 | } else { | 957 | } else { |
| 958 | - write_srchist_fits(time_info, src_info); | 958 | + write_srchist_fits(time_info, max_pixel_info, src_info); |
| 959 | } | 959 | } |
| 960 | } | 960 | } |
| 961 | 961 | ||
| @@ -963,6 +963,7 @@ void ctfindvar::write_srchist(void) | @@ -963,6 +963,7 @@ void ctfindvar::write_srchist(void) | ||
| 963 | * @brief Write individual histograms in CSV format | 963 | * @brief Write individual histograms in CSV format |
| 964 | ***************************************************************************/ | 964 | ***************************************************************************/ |
| 965 | void ctfindvar::write_srchist_csv(const GNdarray& time_info, | 965 | void ctfindvar::write_srchist_csv(const GNdarray& time_info, |
| 966 | + const GNdarray& max_pixel_info, | ||
| 966 | const GNdarray& src_info) | 967 | const GNdarray& src_info) |
| 967 | { | 968 | { |
| 968 | log_string(NORMAL,"Storing histograms in CSV format is not currently supported."); | 969 | log_string(NORMAL,"Storing histograms in CSV format is not currently supported."); |
| @@ -981,47 +982,83 @@ void ctfindvar::write_srchist_csv(const GNdarray& time_info, | @@ -981,47 +982,83 @@ void ctfindvar::write_srchist_csv(const GNdarray& time_info, | ||
| 981 | * significance of the source in that time bin. | 982 | * significance of the source in that time bin. |
| 982 | ***************************************************************************/ | 983 | ***************************************************************************/ |
| 983 | void ctfindvar::write_srchist_fits(const GNdarray& time_info, | 984 | void ctfindvar::write_srchist_fits(const GNdarray& time_info, |
| 985 | + const GNdarray& max_pixel_info, | ||
| 984 | const GNdarray& src_info) | 986 | const GNdarray& src_info) |
| 985 | { | 987 | { |
| 986 | log_string(NORMAL, "Storing histograms in FITS format"); | 988 | log_string(NORMAL, "Storing histograms in FITS format"); |
| 987 | 989 | ||
| 988 | // Create the table | 990 | // Create the table |
| 989 | int nrows = time_info.shape()[1]; | 991 | int nrows = time_info.shape()[1]; |
| 990 | - GFitsBinTable table(nrows); | ||
| 991 | - table.extname("SRCSIGNIF"); | 992 | + GFitsBinTable table_signif(nrows); |
| 993 | + GFitsBinTable table_dir(2); | ||
| 994 | + table_signif.extname("SRCSIGNIF"); | ||
| 995 | + table_dir.extname("SRCPOSITION"); | ||
| 992 | 996 | ||
| 993 | - // Append the start and stop time columns | 997 | + // Append the start/stop time and max pixel columns |
| 994 | GFitsTableFloatCol start_mjd("TSTART", nrows); | 998 | GFitsTableFloatCol start_mjd("TSTART", nrows); |
| 995 | GFitsTableFloatCol stop_mjd("TSTOP", nrows); | 999 | GFitsTableFloatCol stop_mjd("TSTOP", nrows); |
| 996 | - | 1000 | + GFitsTableFloatCol max_pix("MAXSIGPIXEL", nrows); |
| 997 | for (int i=0; i<nrows; i++) { | 1001 | for (int i=0; i<nrows; i++) { |
| 998 | start_mjd(i) = time_info(0,i); | 1002 | start_mjd(i) = time_info(0,i); |
| 999 | stop_mjd(i) = time_info(1,i); | 1003 | stop_mjd(i) = time_info(1,i); |
| 1004 | + max_pix(i) = max_pixel_info(i); | ||
| 1000 | } | 1005 | } |
| 1001 | - table.append(start_mjd); | ||
| 1002 | - table.append(stop_mjd); | 1006 | + table_signif.append(start_mjd); |
| 1007 | + table_signif.append(stop_mjd); | ||
| 1008 | + table_signif.append(max_pix); | ||
| 1009 | + | ||
| 1010 | + // Store the position of the peak pixel | ||
| 1011 | + GFitsTableFloatCol max_pix_dir("MAXSIGPIXEL",2); | ||
| 1012 | + max_pix_dir(0) = m_max_sig_dir.ra_deg(); | ||
| 1013 | + max_pix_dir(1) = m_max_sig_dir.dec_deg(); | ||
| 1014 | + table_dir.append(max_pix_dir); | ||
| 1003 | 1015 | ||
| 1004 | // Append the distribution for each source | 1016 | // Append the distribution for each source |
| 1005 | int src_count = src_info.shape()[0]; | 1017 | int src_count = src_info.shape()[0]; |
| 1006 | for (int src=0; src<src_count; src++) { | 1018 | for (int src=0; src<src_count; src++) { |
| 1019 | + | ||
| 1007 | std::string src_name("SOURCE"); | 1020 | std::string src_name("SOURCE"); |
| 1021 | + GSkyDir src_dir; | ||
| 1022 | + | ||
| 1023 | + // Get the name from the input model file | ||
| 1008 | if (m_inmodel.size() > 0) { | 1024 | if (m_inmodel.size() > 0) { |
| 1009 | src_name = m_inmodel[src]->name(); | 1025 | src_name = m_inmodel[src]->name(); |
| 1026 | + | ||
| 1027 | + // Get source position | ||
| 1028 | + GModelSky* model = dynamic_cast<GModelSky*>(m_inmodel[src]); | ||
| 1029 | + GModelSpatial* model_spatial = model->spatial(); | ||
| 1030 | + GSkyRegion* model_region = model_spatial->region(); | ||
| 1031 | + src_dir = dynamic_cast<GSkyRegionCircle*>(model_region)->centre(); | ||
| 1032 | + } | ||
| 1033 | + // ... otherwise set the position from xsrc,ysrc | ||
| 1034 | + else { | ||
| 1035 | + if ((*this)["coordsys"].string() == "CEL") { | ||
| 1036 | + src_dir.radec_deg((*this)["xsrc"].real(), (*this)["yref"].real()); | ||
| 1037 | + } else { | ||
| 1038 | + src_dir.lb_deg((*this)["xsrc"].real(), (*this)["yref"].real()); | ||
| 1039 | + } | ||
| 1010 | } | 1040 | } |
| 1011 | 1041 | ||
| 1012 | - GFitsTableFloatCol src_sig(src_name, nrows); | ||
| 1013 | - | 1042 | + // Create and fill a new column |
| 1043 | + GFitsTableFloatCol src_sig_col(src_name, nrows); | ||
| 1014 | for (int i=0; i<nrows; i++) { | 1044 | for (int i=0; i<nrows; i++) { |
| 1015 | - src_sig(i) = src_info(src, i); | 1045 | + src_sig_col(i) = src_info(src, i); |
| 1016 | } | 1046 | } |
| 1017 | - table.append(src_sig); | 1047 | + table_signif.append(src_sig_col); |
| 1048 | + | ||
| 1049 | + // Store the positions of the source | ||
| 1050 | + GFitsTableFloatCol src_dir_col(src_name,2); | ||
| 1051 | + src_dir_col(0) = src_dir.ra_deg(); | ||
| 1052 | + src_dir_col(1) = src_dir.dec_deg(); | ||
| 1053 | + table_dir.append(src_dir_col); | ||
| 1018 | } | 1054 | } |
| 1019 | 1055 | ||
| 1020 | // Store information regarding the source positions | 1056 | // Store information regarding the source positions |
| 1021 | 1057 | ||
| 1022 | - // Write the table to a file | 1058 | + // Write the tables to a file |
| 1023 | GFilename outfile((*this)["prefix"].string() + "srcsig.fits"); | 1059 | GFilename outfile((*this)["prefix"].string() + "srcsig.fits"); |
| 1024 | GFits fitsfile; | 1060 | GFits fitsfile; |
| 1025 | - fitsfile.append(table); | 1061 | + fitsfile.append(table_signif); |
| 1062 | + fitsfile.append(table_dir); | ||
| 1026 | fitsfile.saveto(outfile, (*this)["clobber"].boolean() ); | 1063 | fitsfile.saveto(outfile, (*this)["clobber"].boolean() ); |
| 1027 | } | 1064 | } |
src/ctfindvar/ctfindvar.hpp
| @@ -81,14 +81,17 @@ protected: | @@ -81,14 +81,17 @@ protected: | ||
| 81 | // Writing methods for individual source histograms | 81 | // Writing methods for individual source histograms |
| 82 | void write_srchist(void); | 82 | void write_srchist(void); |
| 83 | void write_srchist_csv(const GNdarray& time_info, | 83 | void write_srchist_csv(const GNdarray& time_info, |
| 84 | + const GNdarray& max_pixel_info, | ||
| 84 | const GNdarray& src_info); | 85 | const GNdarray& src_info); |
| 85 | void write_srchist_fits(const GNdarray& time_info, | 86 | void write_srchist_fits(const GNdarray& time_info, |
| 87 | + const GNdarray& max_pixel_info, | ||
| 86 | const GNdarray& src_info); | 88 | const GNdarray& src_info); |
| 87 | 89 | ||
| 88 | // Protected members | 90 | // Protected members |
| 89 | GSkyMap m_counts; //!< Counts for each time interval | 91 | GSkyMap m_counts; //!< Counts for each time interval |
| 90 | GGti m_gti; //!< List of time intervals | 92 | GGti m_gti; //!< List of time intervals |
| 91 | GModels m_inmodel; //!< List of models for source positions | 93 | GModels m_inmodel; //!< List of models for source positions |
| 94 | + GSkyDir m_max_sig_dir; //!< Sky direction associated with maximum significance | ||
| 92 | double m_minoff; //!< Minimum counts for use in significance calculation | 95 | double m_minoff; //!< Minimum counts for use in significance calculation |
| 93 | GSkyMap m_peaksigmap; //!< Skymap holding the maximum significance | 96 | GSkyMap m_peaksigmap; //!< Skymap holding the maximum significance |
| 94 | GNdarray m_pixsigsrc; //!< Store distributions of the source significances | 97 | GNdarray m_pixsigsrc; //!< Store distributions of the source significances |