source: trunk/src/SDMemTable.cc@ 32

Last change on this file since 32 was 22, checked in by mmarquar, 20 years ago

Removed irrelevantr member function "name". Added function to return number of rows in table.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.6 KB
RevLine 
[2]1//#---------------------------------------------------------------------------
2//# SDMemTable.cc: A MemoryTable container for single dish integrations
3//#---------------------------------------------------------------------------
4//# Copyright (C) 2004
5//# Malte Marquarding, ATNF
6//#
7//# This program is free software; you can redistribute it and/or modify it
8//# under the terms of the GNU General Public License as published by the Free
9//# Software Foundation; either version 2 of the License, or (at your option)
10//# any later version.
11//#
12//# This program is distributed in the hope that it will be useful, but
13//# WITHOUT ANY WARRANTY; without even the implied warranty of
14//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15//# Public License for more details.
16//#
17//# You should have received a copy of the GNU General Public License along
18//# with this program; if not, write to the Free Software Foundation, Inc.,
19//# 675 Massachusetts Ave, Cambridge, MA 02139, USA.
20//#
21//# Correspondence concerning this software should be addressed as follows:
22//# Internet email: Malte.Marquarding@csiro.au
23//# Postal address: Malte Marquarding,
24//# Australia Telescope National Facility,
25//# P.O. Box 76,
26//# Epping, NSW, 2121,
27//# AUSTRALIA
28//#
29//# $Id:
30//#---------------------------------------------------------------------------
31
[16]32
[2]33#include <aips/iostream.h>
34#include <aips/Arrays/Array.h>
35#include <aips/Arrays/ArrayMath.h>
36#include <aips/Arrays/MaskArrMath.h>
37#include <aips/Arrays/ArrayLogical.h>
38#include <aips/Arrays/ArrayAccessor.h>
39
40#include <aips/Tables/TableParse.h>
41#include <aips/Tables/TableDesc.h>
42#include <aips/Tables/SetupNewTab.h>
43#include <aips/Tables/ScaColDesc.h>
44#include <aips/Tables/ArrColDesc.h>
45
46#include <aips/Tables/ExprNode.h>
47#include <aips/Tables/ScalarColumn.h>
48#include <aips/Tables/ArrayColumn.h>
[18]49#include <aips/Tables/TableRecord.h>
[2]50
[18]51
[2]52#include "SDMemTable.h"
53#include "SDContainer.h"
54
55using namespace atnf_sd;
56
[18]57SDMemTable::SDMemTable() :
58 IFSel_(0),
59 beamSel_(0),
60 polSel_(0) {
61 setup();
62}
[2]63SDMemTable::SDMemTable(const std::string& name) :
64 IFSel_(0),
65 beamSel_(0),
66 polSel_(0) {
[22]67 Table tab("dummy");
68 table_ = tab.copyToMemoryTable("dummy");
[2]69}
70
[16]71SDMemTable::SDMemTable(const SDMemTable& other, Bool clear) {
[2]72 this->IFSel_= other.IFSel_;
73 this->beamSel_= other.beamSel_;
74 this->polSel_= other.polSel_;
75 this->chanMask_ = other.chanMask_;
76 this->table_ = other.table_.copyToMemoryTable(String("dummy"));
77 // clear all rows()
[16]78 if (clear) {
79 this->table_.removeRow(this->table_.rowNumbers());
80 } else {
81 this->IFSel_ = other.IFSel_;
82 this->beamSel_ = other.beamSel_;
83 this->polSel_ = other.polSel_;
84 }
[2]85}
86
87SDMemTable::SDMemTable(const Table& tab, Int scanID) :
88 IFSel_(0),
89 beamSel_(0),
90 polSel_(0) {
91 String exprs = String("select * from $1 where SCANID == ")
92 +String::toString(scanID);
93 cerr << exprs << endl;
94 Table t = tableCommand(exprs,tab);
[22]95 table_ = t.copyToMemoryTable("dummy");
[2]96}
97
98SDMemTable::~SDMemTable(){
99 cerr << "goodbye from SDMemTable @ " << this << endl;
100}
101
102SDMemTable SDMemTable::getScan(Int scanID) {
103 return SDMemTable(table_, scanID);
104}
105
106void SDMemTable::setup() {
107 TableDesc td("", "1", TableDesc::Scratch);
108 td.comment() = "A SDMemTable";
109 td.addColumn(ScalarColumnDesc<Double>("TIME"));
110 td.addColumn(ScalarColumnDesc<String>("SRCNAME"));
111 td.addColumn(ArrayColumnDesc<Float>("SPECTRA"));
112 td.addColumn(ArrayColumnDesc<uChar>("FLAGTRA"));
113 td.addColumn(ArrayColumnDesc<Float>("TSYS"));
114 td.addColumn(ScalarColumnDesc<Int>("SCANID"));
[16]115 td.addColumn(ScalarColumnDesc<Double>("INTERVAL"));
[2]116 // Now create a new table from the description.
[18]117
[22]118 SetupNewTable aNewTab("dummy", td, Table::New);
[2]119 table_ = Table(aNewTab, Table::Memory, 0);
120}
121
122std::string SDMemTable::getSourceName(Int whichRow) const {
123 ROScalarColumn<String> src(table_, "SRCNAME");
124 String name;
125 src.get(whichRow, name);
126 return name;
127}
128
129Double SDMemTable::getTime(Int whichRow) const {
130 ROScalarColumn<Double> src(table_, "TIME");
131 Double tm;
132 src.get(whichRow, tm);
133 return tm;
134}
135
136bool SDMemTable::setIF(Int whichIF) {
137 //if ( whichIF >= 0 && whichIF < nIF_) {
138 IFSel_ = whichIF;
139 return true;
140 //}
141 //return false;
142}
143bool SDMemTable::setBeam(Int whichBeam) {
144 //if ( whichBeam >= 0 && whichBeam < nBeam_) {
145 beamSel_ = whichBeam;
146 return true;
147 //}
148 //return false;
149
150}
151bool SDMemTable::setPol(Int whichPol) {
152 //if ( whichPol >= 0 && whichPol < nPol_) {
153 polSel_ = whichPol;
154 return true;
155 //}
156 //return false;
157}
158
[16]159bool SDMemTable::setMask(const std::vector<int>& whichChans) {
160 ROArrayColumn<uChar> spec(table_, "FLAGTRA");
161
162 std::vector<int>::iterator it;
163 uInt n = spec.shape(0)(3);
164 chanMask_.resize(n,true);
165 for (it = whichChans.begin(); it != whichChans.end(); it++) {
166 if (*it < n)
167 chanMask_[*it] = false;
168 }
[2]169 return true;
170}
171
[16]172std::vector<bool> SDMemTable::getMask(Int whichRow) const {
173 std::vector<bool> mask;
174 ROArrayColumn<uChar> spec(table_, "FLAGTRA");
175 Array<uChar> arr;
176 spec.get(whichRow, arr);
177 ArrayAccessor<uChar, Axis<0> > aa0(arr);
178 aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
179 ArrayAccessor<uChar, Axis<1> > aa1(aa0);
180 aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
181 ArrayAccessor<uChar, Axis<2> > aa2(aa1);
182 aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
183
184 Bool useUserMask = ( chanMask_.size() == arr.shape()(3) );
185
186 std::vector<bool> tmp;
187 tmp = chanMask_; // WHY the fxxx do I have to make a copy here
188 std::vector<bool>::iterator miter;
189 miter = tmp.begin();
190
191 for (ArrayAccessor<uChar, Axis<3> > i(aa2); i != i.end(); ++i) {
192 bool out =!static_cast<bool>(*i);
193 if (useUserMask) {
194 out = out && (*miter);
195 miter++;
196 }
197 mask.push_back(out);
198 }
199 return mask;
[2]200}
[21]201std::vector<float> SDMemTable::getSpectrum(Int whichRow) {
[2]202
203 std::vector<float> spectrum;
204 ROArrayColumn<Float> spec(table_, "SPECTRA");
205 Array<Float> arr;
206 spec.get(whichRow, arr);
207 ArrayAccessor<Float, Axis<0> > aa0(arr);
208 aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
209 ArrayAccessor<Float, Axis<1> > aa1(aa0);
210 aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
[16]211 ArrayAccessor<Float, Axis<2> > aa2(aa1);
212 aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
213 for (ArrayAccessor<Float, Axis<3> > i(aa2); i != i.end(); ++i) {
214 spectrum.push_back(*i);
[2]215 }
216 return spectrum;
217}
[21]218void SDMemTable::getSpectrum(Vector<Float>& spectrum, Int whichRow=0) {
219 ROArrayColumn<Float> spec(table_, "SPECTRA");
220 Array<Float> arr;
221 spec.get(whichRow, arr);
222 spectrum.resize(arr.shape()(3));
223 ArrayAccessor<Float, Axis<0> > aa0(arr);
224 aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
225 ArrayAccessor<Float, Axis<1> > aa1(aa0);
226 aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
227 ArrayAccessor<Float, Axis<2> > aa2(aa1);
228 aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
[2]229
[21]230 ArrayAccessor<Float, Axis<0> > va(spectrum);
231 for (ArrayAccessor<Float, Axis<3> > i(aa2); i != i.end(); ++i) {
232 (*va) = (*i);
233 va++;
234 }
235}
236
237void SDMemTable::getMask(Vector<Bool>& mask, Int whichRow=0) const {
238 ROArrayColumn<uChar> spec(table_, "FLAGTRA");
239 Array<uChar> arr;
240 spec.get(whichRow, arr);
241 mask.resize(arr.shape()(3));
242
243 ArrayAccessor<uChar, Axis<0> > aa0(arr);
244 aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
245 ArrayAccessor<uChar, Axis<1> > aa1(aa0);
246 aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
247 ArrayAccessor<uChar, Axis<2> > aa2(aa1);
248 aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
249
250 Bool useUserMask = ( chanMask_.size() == arr.shape()(3) );
251
252 ArrayAccessor<Bool, Axis<0> > va(mask);
253 std::vector<bool> tmp;
254 tmp = chanMask_; // WHY the fxxx do I have to make a copy here. The
255 // iterator should work on chanMask_??
256 std::vector<bool>::iterator miter;
257 miter = tmp.begin();
258
259 for (ArrayAccessor<uChar, Axis<3> > i(aa2); i != i.end(); ++i) {
260 bool out =!static_cast<bool>(*i);
261 if (useUserMask) {
262 out = out && (*miter);
263 miter++;
264 }
265 (*va) = out;
266 va++;
267 }
268}
269
[16]270MaskedArray<Float> SDMemTable::rowAsMaskedArray(uInt whichRow,
271 Bool useSelection) {
[2]272 ROArrayColumn<Float> spec(table_, "SPECTRA");
273 Array<Float> arr;
274 ROArrayColumn<uChar> flag(table_, "FLAGTRA");
275 Array<uChar> farr;
276 spec.get(whichRow, arr);
277 flag.get(whichRow, farr);
278 Array<Bool> barr(farr.shape());convertArray(barr, farr);
279 MaskedArray<Float> marr;
[16]280 if (useSelection) {
281 ArrayAccessor<Float, Axis<0> > aa0(arr);
282 aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
283 ArrayAccessor<Float, Axis<1> > aa1(aa0);
284 aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
285 ArrayAccessor<Float, Axis<2> > aa2(aa1);
286 aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
287
288 ArrayAccessor<Bool, Axis<0> > baa0(barr);
289 baa0.reset(baa0.begin(uInt(beamSel_)));//go to beam
290 ArrayAccessor<Bool, Axis<1> > baa1(baa0);
291 baa1.reset(baa1.begin(uInt(IFSel_)));// go to IF
292 ArrayAccessor<Bool, Axis<2> > baa2(baa1);
293 baa2.reset(baa2.begin(uInt(polSel_)));// go to pol
294
295 Vector<Float> a(arr.shape()(3));
296 Vector<Bool> b(barr.shape()(3));
297 ArrayAccessor<Float, Axis<0> > a0(a);
298 ArrayAccessor<Bool, Axis<0> > b0(b);
299
300 ArrayAccessor<Bool, Axis<3> > j(baa2);
301 for (ArrayAccessor<Float, Axis<3> > i(aa2); i != i.end(); ++i) {
302 (*a0) = (*i);
303 (*b0) = !(*j);
304 j++;
305 a0++;
306 b0++;
307 }
308 marr.setData(a,b);
309 } else {
310 marr.setData(arr,!barr);
311 }
[2]312 return marr;
313}
314
315Float SDMemTable::getTsys(Int whichRow) const {
316 ROArrayColumn<Float> ts(table_, "TSYS");
317 Array<Float> arr;
318 ts.get(whichRow, arr);
319 Float out;
320 IPosition ip(arr.shape());
[16]321 ip(0) = beamSel_;ip(1) = IFSel_;ip(2) = polSel_;ip(3)=0;
[2]322 out = arr(ip);
323 return out;
324}
325
326bool SDMemTable::putSDContainer(const SDContainer& sdc) {
327 ScalarColumn<Double> mjd(table_, "TIME");
328 ScalarColumn<String> srcn(table_, "SRCNAME");
329 ArrayColumn<Float> spec(table_, "SPECTRA");
330 ArrayColumn<uChar> flags(table_, "FLAGTRA");
331 ArrayColumn<Float> ts(table_, "TSYS");
332 ScalarColumn<Int> scan(table_, "SCANID");
[16]333 ScalarColumn<Double> integr(table_, "INTERVAL");
[2]334
335 uInt rno = table_.nrow();
336 table_.addRow();
337
338 mjd.put(rno, sdc.timestamp);
339 srcn.put(rno, sdc.sourcename);
340 spec.put(rno, sdc.getSpectrum());
341 flags.put(rno, sdc.getFlags());
342 ts.put(rno, sdc.getTsys());
343 scan.put(rno, sdc.scanid);
[16]344 integr.put(rno, sdc.interval);
345
[2]346 return true;
347}
[18]348
[21]349SDContainer SDMemTable::getSDContainer(uInt whichRow) const {
350 ROScalarColumn<Double> mjd(table_, "TIME");
351 ROScalarColumn<String> srcn(table_, "SRCNAME");
352 ROArrayColumn<Float> spec(table_, "SPECTRA");
353 ROArrayColumn<uChar> flags(table_, "FLAGTRA");
354 ROArrayColumn<Float> ts(table_, "TSYS");
355 ROScalarColumn<Int> scan(table_, "SCANID");
356 ROScalarColumn<Double> integr(table_, "INTERVAL");
357
358 SDContainer sdc(nBeam(),nIF(),nPol(),nChan());
359 mjd.get(whichRow, sdc.timestamp);
360 srcn.get(whichRow, sdc.sourcename);
361 integr.get(whichRow, sdc.interval);
362 scan.get(whichRow, sdc.scanid);
363 Array<Float> spectrum;
364 Array<Float> tsys;
365 Array<uChar> flagtrum;
366 spec.get(whichRow, spectrum);
367 sdc.putSpectrum(spectrum);
368 flags.get(whichRow, flagtrum);
369 sdc.putFlags(flagtrum);
370 ts.get(whichRow, tsys);
371 sdc.putTsys(tsys);
372 return sdc;
373}
[18]374bool SDMemTable::putSDHeader(const SDHeader& sdh) {
375 table_.lock();
376 table_.rwKeywordSet().define("nIF", sdh.nif);
377 table_.rwKeywordSet().define("nBeam", sdh.nbeam);
378 table_.rwKeywordSet().define("nPol", sdh.npol);
379 table_.rwKeywordSet().define("nChan", sdh.nchan);
380 table_.rwKeywordSet().define("Observer", sdh.observer);
381 table_.rwKeywordSet().define("Project", sdh.project);
382 table_.rwKeywordSet().define("Obstype", sdh.obstype);
383 table_.rwKeywordSet().define("AntennaName", sdh.antennaname);
384 table_.rwKeywordSet().define("AntennaPosition", sdh.antennaposition);
385 table_.rwKeywordSet().define("Equinox", sdh.equinox);
386 table_.rwKeywordSet().define("FreqRefFrame", sdh.freqref);
387 table_.rwKeywordSet().define("FreqRefVal", sdh.reffreq);
388 table_.rwKeywordSet().define("Bandwidth", sdh.bandwidth);
389 table_.rwKeywordSet().define("UTC", sdh.utc);
390 table_.unlock();
391 cerr << "Table Header set" << endl;
392 return true;
[21]393}\
394
395SDHeader SDMemTable::getSDHeader() const {
396 SDHeader sdh;
397 table_.keywordSet().get("nBeam",sdh.nbeam);
398 table_.keywordSet().get("nIF",sdh.nif);
399 table_.keywordSet().get("nPol",sdh.npol);
400 table_.keywordSet().get("nChan",sdh.nchan);
401 table_.keywordSet().get("Observer", sdh.observer);
402 table_.keywordSet().get("Project", sdh.project);
403 table_.keywordSet().get("Obstype", sdh.obstype);
404 table_.keywordSet().get("AntennaName", sdh.antennaname);
405 table_.keywordSet().get("AntennaPosition", sdh.antennaposition);
406 table_.keywordSet().get("Equinox", sdh.equinox);
407 table_.keywordSet().get("FreqRefFrame", sdh.freqref);
408 table_.keywordSet().get("FreqRefVal", sdh.reffreq);
409 table_.keywordSet().get("Bandwidth", sdh.bandwidth);
410 table_.keywordSet().get("UTC", sdh.utc);
411 return sdh;
[18]412}
[2]413void SDMemTable::makePersistent(const std::string& filename) {
414 table_.deepCopy(filename,Table::New);
415}
416
417void SDMemTable::summary() const {
418 ROScalarColumn<Int> scans(table_, "SCANID");
419 ROScalarColumn<String> srcs(table_, "SRCNAME");
[18]420 cout << "*************** Header ***************" << endl;
421 cout << "nBeam = " << nBeam() << "\t"
422 << "nIF = " << nIF() << endl
423 << "nPol = " << nPol() << "\t"
424 << "nChan = " << nChan() << "\t" << endl;
425 cout << "*************** Header ***************" << endl;
[2]426 uInt count = 0;
427 String name;
428 Int previous = -1;Int current=0;
429 cout << "Scan\tSource" << endl;
430 for (uInt i=0; i< scans.nrow();i++) {
431 scans.getScalar(i,current);
432 if (previous != current) {
433 srcs.getScalar(i,name);
434 previous = current;
435 count++;
[16]436 cout << count << "\t"
437 << name
438 << endl;
[2]439 }
440 }
[18]441 cout << "Table contains " << table_.nrow() << " integration(s)." << endl;
442 cout << "in " << count << " scan(s)." << endl;
[2]443}
[18]444
445Int SDMemTable::nBeam() const {
446 Int n;
447 table_.keywordSet().get("nBeam",n);
448 return n;
449}
450Int SDMemTable::nIF() const {
451 Int n;
452 table_.keywordSet().get("nIF",n);
453 return n;
454}
455Int SDMemTable::nPol() const {
456 Int n;
457 table_.keywordSet().get("nPol",n);
458 return n;
459}
460Int SDMemTable::nChan() const {
461 Int n;
462 table_.keywordSet().get("nChan",n);
463 return n;
464}
[16]465/*
[18]466void SDMemTable::maskChannels(const std::vector<Int>& whichChans ) {
[16]467
468 std::vector<int>::iterator it;
469 ArrayAccessor<uChar, Axis<2> > j(flags_);
470 for (it = whichChans.begin(); it != whichChans.end(); it++) {
471 j.reset(j.begin(uInt(*it)));
472 for (ArrayAccessor<uChar, Axis<0> > i(j); i != i.end(); ++i) {
473 for (ArrayAccessor<uChar, Axis<1> > ii(i); ii != ii.end(); ++ii) {
474 for (ArrayAccessor<uChar, Axis<3> > iii(ii);
475 iii != iii.end(); ++iii) {
476 (*iii) =
477 }
478 }
479 }
480 }
481
482}
483*/
Note: See TracBrowser for help on using the repository browser.