source: trunk/src/Scantable.h@ 1149

Last change on this file since 1149 was 1111, checked in by mar637, 18 years ago

add getNumbers utility function, which is now called by all function which retrieve numbers from the Scantable

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.1 KB
RevLine 
[824]1//
2// C++ Interface: Scantable
3//
4// Description:
5//
6//
7// Author: Malte Marquarding <asap@atnf.csiro.au>, (C) 2005
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#ifndef ASAPSCANTABLE_H
13#define ASAPSCANTABLE_H
[2]14
15// STL
16#include <string>
17#include <vector>
18// AIPS++
[455]19#include <casa/aips.h>
[322]20#include <casa/Arrays/MaskedArray.h>
[80]21#include <casa/BasicSL/String.h>
[824]22#include <casa/Utilities/CountedPtr.h>
23
[322]24#include <coordinates/Coordinates/SpectralCoordinate.h>
[824]25
[80]26#include <tables/Tables/Table.h>
[322]27#include <tables/Tables/ArrayColumn.h>
28#include <tables/Tables/ScalarColumn.h>
29
[824]30#include <measures/TableMeasures/ScalarMeasColumn.h>
31
[894]32#include "Logger.h"
[901]33#include "STHeader.h"
[824]34#include "STFrequencies.h"
35#include "STWeather.h"
36#include "STFocus.h"
37#include "STTcal.h"
38#include "STMolecules.h"
39#include "STSelector.h"
[860]40#include "STHistory.h"
[896]41#include "STPol.h"
[960]42#include "STFit.h"
[972]43#include "STFitEntry.h"
[2]44
[824]45namespace asap {
[2]46
[824]47/**
48 * This class contains and wraps a casa::Table, which is used to store
49 * all the information. This can be either a MemoryTable or a
50 * disk based Table.
51 * It provides access functions to the underlying table
52 * It contains n subtables:
53 * @li weather
54 * @li frequencies
55 * @li molecules
56 * @li tcal
57 * @li focus
58 * @li fits
59 *
60 * @brief The main ASAP data container
61 * @author Malte Marquarding
62 * @date
63 * @version
64*/
[890]65class Scantable : private Logger
[824]66{
[902]67
68friend class STMath;
69
[2]70public:
[824]71 /**
72 * Default constructor
73 */
74 Scantable(casa::Table::TableType ttype = casa::Table::Memory);
[19]75
[824]76 /**
77 * Create a Scantable object form an existing table on disk
78 * @param[in] name the name of the existing Scantable
79 */
80 Scantable(const std::string& name, casa::Table::TableType ttype = casa::Table::Memory);
[2]81
[824]82 /// @fixme this is only sensible for MemoryTables....
83 Scantable(const Scantable& other, bool clear=true);
[161]84
[824]85 /**
86 * Destructor
87 */
88 virtual ~Scantable();
[745]89
[824]90 /**
91 * get a const reference to the underlying casa::Table
[1104]92 * @return const \ref casa::Table reference
[824]93 */
94 const casa::Table& table() const;
[19]95
[824]96 /**
97 * get a reference to the underlying casa::Table with the Selection
98 * object applied if set
99 * @return casa::Table reference
100 */
101 casa::Table& table();
[21]102
[845]103
104 /**
105 * Get a handle to the selection object
106 * @return constant STSelector reference
107 */
108 const STSelector& getSelection() const { return selector_; }
109
110 /**
111 * Set the data to be a subset as defined by the STSelector
112 * @param selection a STSelector object
113 */
[824]114 void setSelection(const STSelector& selection);
[845]115
116 /**
117 * unset the selection of the data
118 */
[824]119 void unsetSelection();
120 /**
121 * set the header
[901]122 * @param[in] sdh an STHeader object
[824]123 */
[901]124 void setHeader( const STHeader& sth );
[386]125
[824]126 /**
127 * get the header information
[901]128 * @return an STHeader object
[824]129 */
[901]130 STHeader getHeader( ) const;
[1068]131
[824]132 /**
133 * Checks if the "other" Scantable is conformant with this,
134 * i.e. if header values are the same.
135 * @param[in] other another Scantable
136 * @return true or false
137 */
138 bool conformant( const Scantable& other);
[430]139
[824]140 /**
[1068]141 *
142 * @param stype The type of the source, 0 = on, 1 = off
143 */
144 void setSourceType(int stype);
145
146
147 /**
[1104]148 * The number of scans in the table
[824]149 * @return number of scans in the table
150 */
[845]151 int nscan() const;
[490]152
[915]153 casa::MEpoch::Types getTimeReference() const;
[21]154
[824]155 /**
156 * Get global antenna position
[845]157 * @return casa::MPosition
[824]158 */
159 casa::MPosition getAntennaPosition() const;
[490]160
[1104]161 /**
162 * the @ref casa::MDirection for a specific row
163 * @param[in] whichrow the row number
164 * return casa::MDirection
165 */
[987]166 casa::MDirection getDirection( int whichrow ) const;
167
[1104]168 /**
169 * get the direction type as a string, e.g. "J2000"
170 * @param[in] whichrow the row number
171 * return the direction string
172 */
[1068]173 std::string getDirectionString( int whichrow ) const;
174
[1104]175 /**
176 * set the direction type as a string, e.g. "J2000"
177 * @param[in] the direction type
178 */
[987]179 void setDirectionRefString(const std::string& refstr="");
[1104]180 /**
181 * get the direction reference string
182 * @return a string describing the direction reference
183 */
184 std::string getDirectionRefString() const; /**
185 * get the direction type as a string, e.g. "J2000"
186 * param[in] whichrow the row number
187 * return the direction string
188 */
189
[987]190
[824]191 /**
[845]192 * Return the Flux unit of the data, e.g. "Jy" or "K"
193 * @return string
[824]194 */
195 std::string getFluxUnit() const;
[472]196
[824]197 /**
[845]198 * Set the Flux unit of the data
199 * @param unit a string representing the unit, e.g "Jy" or "K"
[824]200 */
201 void setFluxUnit( const std::string& unit );
[472]202
[824]203 /**
204 *
[845]205 * @param instrument a string representing an insturment. see xxx
[824]206 */
207 void setInstrument( const std::string& instrument );
[2]208
[845]209 /**
210 * (Re)calculate the azimuth and elevationnfor all rows
211 */
[824]212 void calculateAZEL();
[745]213
[824]214 /**
[845]215 * "hard" flag the data, this flags everything selected in setSelection()
[1104]216 * param[in] msk a boolean mask of length nchan describing the points to
217 * to be flagged
[824]218 */
[1000]219 void flag( const std::vector<bool>& msk = std::vector<bool>());
[455]220
[852]221 /**
222 * Return a list of row numbers with respect to the original table.
[902]223 * @return a list of unsigned ints
[852]224 */
225 std::vector<unsigned int> rownumbers() const;
[845]226
[852]227
[845]228 /**
229 * Get the number of beams in the data or a specific scan
230 * @param scanno the scan number to get the number of beams for.
231 * If scanno<0 the number is retrieved from the header.
232 * @return an integer number
233 */
[824]234 int nbeam(int scanno=-1) const;
[845]235 /**
236 * Get the number of IFs in the data or a specific scan
237 * @param scanno the scan number to get the number of IFs for.
238 * If scanno<0 the number is retrieved from the header.
239 * @return an integer number
240 */
[824]241 int nif(int scanno=-1) const;
[845]242 /**
243 * Get the number of polarizations in the data or a specific scan
244 * @param scanno the scan number to get the number of polarizations for.
245 * If scanno<0 the number is retrieved from the header.
246 * @return an integer number
247 */
[824]248 int npol(int scanno=-1) const;
[794]249
[896]250 std::string getPolType() const;
251
[845]252
253 /**
254 * Get the number of integartion cycles
255 * @param scanno the scan number to get the number of rows for.
256 * If scanno<0 the number is retrieved from the header.
[1104]257 * @return the number of rows (for the specified scanno)
[845]258 */
[824]259 int nrow(int scanno=-1) const;
[794]260
[1111]261 int getBeam(int whichrow) const;
262 std::vector<uint> getBeamNos() { return getNumbers(beamCol_); }
[50]263
[847]264 int getIF(int whichrow) const;
[1111]265 std::vector<uint> getIFNos() { return getNumbers(ifCol_); }
266
[847]267 int getPol(int whichrow) const;
[1111]268 std::vector<uint> getPolNos() { return getNumbers(polCol_); }
269
270 std::vector<uint> getScanNos() { return getNumbers(scanCol_); }
[865]271 int getScan(int whichrow) const { return scanCol_(whichrow); }
[1111]272
273 /**
274 * Get the number of channels in the data or a specific IF. This currently
275 * varies only with IF number
276 * @param ifno the IF number to get the number of channels for.
277 * If ifno<0 the number is retrieved from the header.
278 * @return an integer number
279 */
280 int nchan(int ifno=-1) const;
[923]281 int getChannels(int whichrow) const;
[206]282
[1111]283 int ncycle(int scanno=-1) const;
284 int getCycle(int whichrow) const { return cycleCol_(whichrow); }
285
[847]286 double getInterval(int whichrow) const
287 { return integrCol_(whichrow); }
[845]288
[865]289 float getTsys(int whichrow) const
290 { return casa::Vector<casa::Float>(tsysCol_(whichrow))(0); }
[847]291 float getElevation(int whichrow) const
292 { return elCol_(whichrow); }
293 float getAzimuth(int whichrow) const
294 { return azCol_(whichrow); }
[865]295 float getParAngle(int whichrow) const
[847]296 { return paraCol_(whichrow); }
[386]297
[865]298 std::string getSourceName(int whichrow) const
299 { return srcnCol_(whichrow); }
300
[847]301 std::vector<bool> getMask(int whichrow) const;
[896]302 std::vector<float> getSpectrum(int whichrow,
[905]303 const std::string& poltype = "" ) const;
[847]304
[884]305 void setSpectrum(const std::vector<float>& spec, int whichrow);
306
[902]307 std::string getPolarizationLabel(int index, const std::string& ptype) const
308 { return STPol::getPolLabel(index, ptype ); }
[401]309
[845]310 /**
311 * Write the Scantable to disk
312 * @param filename the output file name
313 */
[824]314 void makePersistent(const std::string& filename);
[745]315
[860]316 std::vector<std::string> getHistory() const
317 { return historyTable_.getHistory(); };
[483]318
[860]319 void addHistory(const std::string& hist) { historyTable_.addEntry(hist); }
[488]320
[860]321 void appendToHistoryTable(const STHistory& otherhist)
322 { historyTable_.append(otherhist); }
323
[824]324 std::string summary(bool verbose=false);
325 std::string getTime(int whichrow=-1, bool showdate=true) const;
[19]326
[847]327 // returns unit, conversion frame, doppler, base-frame
[18]328
[847]329 /**
330 * Get the frequency set up
331 * This is forwarded to the STFrequencies subtable
332 * @return unit, frame, doppler
333 */
334 std::vector<std::string> getCoordInfo() const
335 { return freqTable_.getInfo(); };
336
337 void setCoordInfo(std::vector<string> theinfo)
338 { return freqTable_.setInfo(theinfo); };
339
[865]340
341 std::vector<double> getAbcissa(int whichrow) const;
342
[847]343 std::string getAbcissaLabel(int whichrow) const;
344 std::vector<double> getRestFrequencies() const
345 { return moleculeTable_.getRestFrequencies(); }
346
347 void setRestFrequencies(double rf, const std::string& = "Hz");
348 void setRestFrequencies(const std::string& name);
349
[987]350 void convertDirection(const std::string& newframe);
351
[824]352 STFrequencies& frequencies() { return freqTable_; }
353 STWeather& weather() { return weatherTable_; }
354 STFocus& focus() { return focusTable_; }
355 STTcal& tcal() { return tcalTable_; }
356 STMolecules& molecules() { return moleculeTable_; }
[860]357 STHistory& history() { return historyTable_; }
[972]358 STFit& fit() { return fitTable_; }
[2]359
[902]360 std::vector<std::string> columnNames() const;
[896]361
[972]362 void addFit(const STFitEntry& fit, int row);
363 STFitEntry getFit(int row) const
364 { STFitEntry fe; fitTable_.getEntry(fe, mfitidCol_(row)); return fe; }
365
[824]366private:
[896]367
368 casa::Matrix<casa::Float> getPolMatrix( casa::uInt whichrow ) const;
369
[824]370 /**
371 * Turns a time vale into a formatted string
372 * @param x
373 * @return
374 */
375 std::string formatSec(casa::Double x) const;
[18]376
[824]377 std::string formatTime(const casa::MEpoch& me, bool showdate)const;
[22]378
[824]379 /**
380 * Turns a casa::MDirection into a nicely formatted string
381 * @param md an casa::MDirection
382 * @return
383 */
384 std::string formatDirection(const casa::MDirection& md) const;
[19]385
[286]386
[824]387 /**
388 * Create a unique file name for the paged (temporary) table
389 * @return just the name
390 */
391 static casa::String generateName();
[286]392
[824]393 /**
394 * attach to cached columns
395 */
396 void attach();
[50]397
[824]398 /**
399 * Set up the main casa::Table
400 */
401 void setupMainTable();
[88]402
[859]403 void attachSubtables();
[865]404 void copySubtables(const Scantable& other);
405
[824]406 /**
407 * Convert an "old" asap1 style row index into a new index
408 * @param[in] therow
409 * @return and index into @table_
410 */
411 int rowToScanIndex(int therow);
[212]412
[1111]413 std::vector<uint> getNumbers(casa::ScalarColumn<casa::uInt>& col);
414
[1030]415 static const casa::uInt version_ = 2;
[286]416
[824]417 STSelector selector_;
[236]418
[824]419 casa::Table::TableType type_;
[465]420
[824]421 // the actual data
422 casa::Table table_;
423 casa::Table originalTable_;
[745]424
[824]425 STTcal tcalTable_;
426 STFrequencies freqTable_;
427 STWeather weatherTable_;
428 STFocus focusTable_;
429 STMolecules moleculeTable_;
[860]430 STHistory historyTable_;
[960]431 STFit fitTable_;
[860]432
[824]433 // Cached Columns to avoid reconstructing them for each row get/put
[847]434 casa::ScalarColumn<casa::Double> integrCol_;
[824]435 casa::MDirection::ScalarColumn dirCol_;
[847]436 casa::MEpoch::ScalarColumn timeCol_;
[923]437 casa::ScalarColumn<casa::Float> azCol_;
438 casa::ScalarColumn<casa::Float> elCol_;
[824]439 casa::ScalarColumn<casa::Float> paraCol_;
440 casa::ScalarColumn<casa::String> srcnCol_, fldnCol_;
[847]441 casa::ScalarColumn<casa::uInt> scanCol_, beamCol_, ifCol_, polCol_, cycleCol_;
[1068]442 casa::ScalarColumn<casa::Int> rbeamCol_, srctCol_;
[865]443 casa::ArrayColumn<casa::Float> specCol_, tsysCol_;
[824]444 casa::ArrayColumn<casa::uChar> flagsCol_;
[430]445
[824]446 // id in frequencies table
447 casa::ScalarColumn<casa::uInt> mfreqidCol_;
448 // id in tcal table
449 casa::ScalarColumn<casa::uInt> mtcalidCol_;
[430]450
[824]451 casa::ArrayColumn<casa::String> histitemCol_;
[972]452 casa::ScalarColumn<casa::Int> mfitidCol_;
[824]453 casa::ScalarColumn<casa::uInt> mweatheridCol_;
[322]454
[824]455 casa::ScalarColumn<casa::uInt> mfocusidCol_;
456
457 casa::ScalarColumn<casa::uInt> mmolidCol_;
458
[896]459 static std::map<std::string, STPol::STPolFactory *> factories_;
460 void initFactories();
461
[2]462};
463
[824]464
465} // namespace
466
[2]467#endif
Note: See TracBrowser for help on using the repository browser.