/***********************************************************************//** * @brief Set sky directions and solid angles of events cube. * * @exception GLATException::no_sky * No sky pixels found in event cube. * * This method computes the sky directions and solid angles for all event * cube pixels. Sky directions are stored in an array of GLATInstDir objects * while solid angles are stored in units of sr in a double precision array. ***************************************************************************/ void GLATEventCube::set_directions(void) { // Throw an error if we have no sky pixels if (npix() < 1) { throw GLATException::no_sky(G_SET_DIRECTIONS, "Every LAT event cube" " needs a definition of the sky pixels."); } // Clear old pixel directions and solid angle m_dirs.clear(); m_solidangle.clear(); // Reserve space for pixel directions and solid angles m_dirs.reserve(npix()); m_solidangle.reserve(npix()); // Set pixel directions and solid angles for (int iy = 0; iy < ny(); ++iy) { for (int ix = 0; ix < nx(); ++ix) { GSkyPixel pixel = GSkyPixel(double(ix), double(iy)); m_dirs.push_back(GLATInstDir(m_map.pix2dir(pixel))); m_solidangle.push_back(m_map.solidangle(pixel)); } } // Return return; }
/***********************************************************************//** * @brief Set event bin * * @param[in] index Event index [0,...,size()-1]. * * @exception GException::out_of_range * Event index is outside valid range. * @exception GCTAException::no_energies * Energy vectors have not been set up. * @exception GCTAException::no_dirs * Sky directions and solid angles vectors have not been set up. * * This method provides the event attributes to the event bin. The event bin * is in fact physically stored in the event cube, and only a single event * bin is indeed allocated. This method sets up the pointers in the event * bin so that a client can easily access the information of individual bins * as if they were stored in an array. ***************************************************************************/ void GCTAEventCube::set_bin(const int& index) { // Optionally check if the index is valid #if defined(G_RANGE_CHECK) if (index < 0 || index >= size()) throw GException::out_of_range(G_SET_BIN, index, 0, size()-1); #endif // Check for the existence of energies and energy widths if (m_energies.size() != ebins() || m_ewidth.size() != ebins()) throw GCTAException::no_energies(G_SET_BIN); // Check for the existence of sky directions and solid angles if (m_dirs.size() != npix() || m_omega.size() != npix()) throw GCTAException::no_dirs(G_SET_BIN); // Get pixel and energy bin indices. int ipix = index % npix(); int ieng = index / npix(); // Set pointers m_bin.m_counts = &(m_map.pixels()[index]); m_bin.m_energy = &(m_energies[ieng]); m_bin.m_time = &m_time; m_bin.m_dir = &(m_dirs[ipix]); m_bin.m_omega = &(m_omega[ipix]); m_bin.m_ewidth = &(m_ewidth[ieng]); m_bin.m_ontime = &m_ontime; // Return return; }
/***********************************************************************//** * @brief Print event cube information ***************************************************************************/ std::string GCTAEventCube::print(void) const { // Initialise result string std::string result; // Append header result.append("=== GCTAEventCube ==="); result.append("\n"+parformat("Number of events")+str(number())); result.append("\n"+parformat("Number of elements")+str(size())); result.append("\n"+parformat("Number of pixels")+str(npix())); result.append("\n"+parformat("Number of energy bins")+str(ebins())); // Append skymap definition result.append("\n"+m_map.print()); // Append GTI intervals result.append("\n"+parformat("Time interval")); if (gti().size() > 0) { result.append(str(tstart().secs())+" - "+str(tstop().secs())+" sec"); } else { result.append("not defined"); } // Append energy intervals if (ebounds().size() > 0) { result.append("\n"+ebounds().print()); } else { result.append("\n"+parformat("Energy intervals")+"not defined"); } // Return result return result; }
/***********************************************************************//** * @brief Print event cube information * * @param[in] chatter Chattiness. * @return String containing event cube information. ***************************************************************************/ std::string GCTAEventCube::print(const GChatter& chatter) const { // Initialise result string std::string result; // Continue only if chatter is not silent if (chatter != SILENT) { // Append header result.append("=== GCTAEventCube ==="); result.append("\n"+gammalib::parformat("Number of events") + gammalib::str(number())); result.append("\n"+gammalib::parformat("Number of elements") + gammalib::str(size())); result.append("\n"+gammalib::parformat("Number of pixels") + gammalib::str(npix())); result.append("\n"+gammalib::parformat("Number of energy bins") + gammalib::str(ebins())); // Append GTI intervals result.append("\n"+gammalib::parformat("Time interval")); if (gti().size() > 0) { result.append(gammalib::str(tstart().secs()) + " - " + gammalib::str(tstop().secs())+" sec"); } else { result.append("not defined"); } // Append energy intervals if (gammalib::reduce(chatter) > SILENT) { if (ebounds().size() > 0) { result.append("\n"+ebounds().print(gammalib::reduce(chatter))); } else { result.append("\n"+gammalib::parformat("Energy intervals") + "not defined"); } } // Append skymap definition if (gammalib::reduce(chatter) > SILENT) { result.append("\n"+m_map.print(gammalib::reduce(chatter))); } } // endif: chatter was not silent // Return result return result; }
/***********************************************************************//** * @brief Set event bin * * @param[in] index Event index [0,...,size()-1]. * * @exception GException::out_of_range * Event index is outside valid range. * @exception GLATException::no_energies * Energy vectors have not been set up. * @exception GLATException::no_dirs * Sky directions and solid angles vectors have not been set up. * * This method provides the event attributes to the event bin. The event bin * is in fact physically stored in the event cube, and only a single event * bin is indeed allocated. This method sets up the pointers in the event * bin so that a client can easily access the information of individual bins * as if they were stored in an array. ***************************************************************************/ void GLATEventCube::set_bin(const int& index) { // Optionally check if the index is valid #if defined(G_RANGE_CHECK) if (index < 0 || index >= size()) { throw GException::out_of_range(G_SET_BIN, index, 0, size()-1); } #endif // Check for the existence of energies and energy widths if (m_energies.size() != ebins() || m_ewidth.size() != ebins()) { throw GLATException::no_energies(G_SET_BIN); } // Check for the existence of sky directions and solid angles if (m_dirs.size() != npix() || m_solidangle.size() != npix()) { throw GLATException::no_dirs(G_SET_BIN); } // Get pixel and energy bin indices. m_bin.m_index = index; m_bin.m_ipix = index % npix(); m_bin.m_ieng = index / npix(); // Set pointers m_bin.m_cube = this; m_bin.m_counts = const_cast<double*>(&(m_map.pixels()[index])); m_bin.m_energy = &(m_energies[m_bin.m_ieng]); m_bin.m_time = &m_time; m_bin.m_dir = &(m_dirs[m_bin.m_ipix]); m_bin.m_solidangle = &(m_solidangle[m_bin.m_ipix]); m_bin.m_ewidth = &(m_ewidth[m_bin.m_ieng]); m_bin.m_ontime = &m_ontime; // Return return; }
/***********************************************************************//** * @brief Print column information * * @param[in] chatter Chattiness. * @return String containing column information. * * @todo Format and cfitsio information is mainly for debugging. This could * be vanish in a more stable version of the code, or it could be compiled * in conditionally using a debug option. ***************************************************************************/ std::string GFitsImage::print(const GChatter& chatter) const { // Initialise result string std::string result; // Continue only if chatter is not silent if (chatter != SILENT) { // Append header result.append("=== GFitsImage ==="); // Append HDU information result.append("\n"+print_hdu(chatter)); // Append image dimensions result.append("\n"+gammalib::parformat("Image type")); result.append(typecode(type())); result.append("\n"+gammalib::parformat("Number of dimensions")); result.append(gammalib::str(naxis())); result.append("\n"+gammalib::parformat("Number of image pixels")); result.append(gammalib::str(npix())); for (int i = 0; i < naxis(); ++i) { result.append("\n"+gammalib::parformat("Number of bins in "+gammalib::str(i))); result.append(gammalib::str(naxes(i))); } // NORMAL: Append header information if (chatter >= NORMAL) { result.append(+"\n"+m_header.print(gammalib::reduce(chatter))); } } // endif: chatter was not silent // Return result return result; }