Commit 653cef59ae1556adb056ebba69f5b94e76fb694b
1 parent
e60b9633
first functional version
Showing
3 changed files
with
115 additions
and
20 deletions
pyext/ctselect.i
src/ctselect/ctselect.cpp
| ... | ... | @@ -22,11 +22,17 @@ |
| 22 | 22 | #endif |
| 23 | 23 | #include <stdio.h> |
| 24 | 24 | #include "ctselect.hpp" |
| 25 | +#include "GTools.hpp" | |
| 25 | 26 | |
| 26 | 27 | /* __ Debug definitions __________________________________________________ */ |
| 27 | 28 | #define BIT_COLUMN_TEST 0 |
| 28 | 29 | #define STRING_COLUMN_TEST 1 |
| 29 | 30 | |
| 31 | +/* __ Coding definitions _________________________________________________ */ | |
| 32 | +#define SELECT_TIME 0 | |
| 33 | +#define SELECT_ENERGY 1 | |
| 34 | +#define SELECT_ROI 1 | |
| 35 | + | |
| 30 | 36 | |
| 31 | 37 | /*========================================================================== |
| 32 | 38 | = = |
| ... | ... | @@ -97,6 +103,9 @@ ctselect::~ctselect(void) |
| 97 | 103 | |
| 98 | 104 | /***********************************************************************//** |
| 99 | 105 | * @brief Select event data |
| 106 | + * | |
| 107 | + * A GTI is appended to the FITS file as in the actual data format no GTI | |
| 108 | + * exists. | |
| 100 | 109 | ***************************************************************************/ |
| 101 | 110 | void ctselect::run(void) |
| 102 | 111 | { |
| ... | ... | @@ -112,6 +121,13 @@ void ctselect::run(void) |
| 112 | 121 | // Select events |
| 113 | 122 | select(); |
| 114 | 123 | |
| 124 | + // Append GTI to FITS file | |
| 125 | + append_gti(); | |
| 126 | + | |
| 127 | + // Write separator into logger | |
| 128 | + if (logTerse()) | |
| 129 | + log << std::endl; | |
| 130 | + | |
| 115 | 131 | // Return |
| 116 | 132 | return; |
| 117 | 133 | } |
| ... | ... | @@ -144,30 +160,105 @@ void ctselect::get_parameters(void) |
| 144 | 160 | /***********************************************************************//** |
| 145 | 161 | * @brief Select events |
| 146 | 162 | * |
| 147 | - * @todo An interesting alternative is the fits_select_rows routine which copies | |
| 148 | - * the selected rows from one FITS table to another. That's in fact the thing | |
| 149 | - * we want to achieve here. The only way to use this routine would be to | |
| 150 | - * open 2 FITS files, one for the input data and a fresh one for the output | |
| 151 | - * data. The events table would then be copied over using the select routine, | |
| 152 | - * any other tables would be copied over directly. The code would look like: | |
| 153 | - * | |
| 154 | - * GFits infile(m_infile); | |
| 155 | - * GFits outfile(m_outfile); | |
| 156 | - * for (int extno = 0; extno < infile.size(); ++extno) { | |
| 157 | - * GFitsHDU* inhdu = infile.hdu(i); | |
| 158 | - * if (inhdu->extname() == "EVENTS") { | |
| 159 | - * GFitsHDU* outhdu = inhdu->select("expression"); | |
| 160 | - * outfile.append_hdu(*outhdu); | |
| 161 | - * } | |
| 162 | - * else | |
| 163 | - * outfile.append_hdu(*inhdu); | |
| 164 | - * } | |
| 165 | - * outfile.save(); | |
| 166 | - * outfile.close(); | |
| 163 | + * Select events from a FITS file by making use of the selection possibility | |
| 164 | + * of the cfitsio library on loading a file into memory. Event selection is | |
| 165 | + * kept optional (on compile time) as the data format may still evolve (for | |
| 166 | + * the time being the TIME information is not valid). | |
| 167 | 167 | * |
| 168 | + * @todo Set data selection keywords. | |
| 168 | 169 | ***************************************************************************/ |
| 169 | 170 | void ctselect::select(void) |
| 170 | 171 | { |
| 172 | + // Write Header for event selection | |
| 173 | + if (logTerse()) { | |
| 174 | + log << std::endl; | |
| 175 | + log.header1("Event selection"); | |
| 176 | + } | |
| 177 | + | |
| 178 | + // Build selection string | |
| 179 | + std::string selection; | |
| 180 | + #if SELECT_TIME | |
| 181 | + selection = "TIME >= "+str(m_tmin)+" && TIME <= "+str(m_tmax); | |
| 182 | + if (logTerse()) | |
| 183 | + log << " Time range ................: " << m_tmin << "-" << m_tmax | |
| 184 | + << std::endl; | |
| 185 | + #endif | |
| 186 | + #if SELECT_ENERGY | |
| 187 | + if (selection.length() > 0) | |
| 188 | + selection += " && "; | |
| 189 | + selection += "ENERGY >= "+str(m_emin)+" && ENERGY <= "+str(m_emax); | |
| 190 | + if (logTerse()) | |
| 191 | + log << " Energy range ..............: " << m_emin << "-" << m_emax | |
| 192 | + << " TeV" << std::endl; | |
| 193 | + #endif | |
| 194 | + #if SELECT_ROI | |
| 195 | + if (selection.length() > 0) | |
| 196 | + selection += " && "; | |
| 197 | + selection += "ANGSEP("+str(m_ra)+","+str(m_dec)+",RA,DEC) <= "+str(m_rad); | |
| 198 | + if (logTerse()) { | |
| 199 | + log << " Acceptance cone centre ....: RA=" << m_ra << ", DEC=" << m_dec | |
| 200 | + << " deg" << std::endl; | |
| 201 | + log << " Acceptance cone radius ....: " << m_rad << " deg" << std::endl; | |
| 202 | + } | |
| 203 | + #endif | |
| 204 | + if (logTerse()) | |
| 205 | + log << " cfitsio selection .........: " << selection << std::endl; | |
| 206 | + | |
| 207 | + // Build input filename including selection expression | |
| 208 | + std::string expression = m_infile; | |
| 209 | + if (selection.length() > 0) | |
| 210 | + expression += "[EVENTS]["+selection+"]"; | |
| 211 | + if (logTerse()) | |
| 212 | + log << " FITS filename .............: " << expression << std::endl; | |
| 213 | + | |
| 214 | + // Open FITS file | |
| 215 | + GFits file(expression); | |
| 216 | + | |
| 217 | + // Save output FITS file | |
| 218 | + file.saveto(m_outfile, clobber()); | |
| 219 | + | |
| 220 | + // Close FITS file | |
| 221 | + file.close(); | |
| 222 | + | |
| 223 | + // Return | |
| 224 | + return; | |
| 225 | +} | |
| 226 | + | |
| 227 | + | |
| 228 | +/***********************************************************************//** | |
| 229 | + * @brief Append GTI to FITS file | |
| 230 | + ***************************************************************************/ | |
| 231 | +void ctselect::append_gti(void) | |
| 232 | +{ | |
| 233 | + // Allocate Gti | |
| 234 | + GGti gti; | |
| 235 | + | |
| 236 | + // Setup single GTI covering the selected time range | |
| 237 | + GTime tstart; | |
| 238 | + GTime tstop; | |
| 239 | + tstart.met(m_tmin); | |
| 240 | + tstop.met(m_tmax); | |
| 241 | + gti.add(tstart, tstop); | |
| 242 | + | |
| 243 | + // Save GTI | |
| 244 | + GFits file(m_outfile); | |
| 245 | + gti.write(&file); | |
| 246 | + file.save(); | |
| 247 | + file.close(); | |
| 248 | + | |
| 249 | + // Return | |
| 250 | + return; | |
| 251 | +} | |
| 252 | + | |
| 253 | + | |
| 254 | +/***********************************************************************//** | |
| 255 | + * @brief Copy events | |
| 256 | + * | |
| 257 | + * This is some old code that is not used but that is kept for the moment | |
| 258 | + * for debugging purposes. | |
| 259 | + ***************************************************************************/ | |
| 260 | +void ctselect::copy(void) | |
| 261 | +{ | |
| 171 | 262 | // Open FITS file |
| 172 | 263 | GFits file(m_infile); |
| 173 | 264 | //std::cout << file << std::endl; | ... | ... |