source: trunk/src/SDMemTable.cc @ 18

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

Moved SDHeader from SDReader to SDConatiner. Added header to SDMemTable. Added access funtions to nif,nbema,npol,nchan

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.6 KB
Line 
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
32
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>
49#include <aips/Tables/TableRecord.h>
50
51
52#include "SDMemTable.h"
53#include "SDContainer.h"
54
55using namespace atnf_sd;
56
57SDMemTable::SDMemTable() :
58  IFSel_(0),
59  beamSel_(0),
60  polSel_(0) {
61  setup();
62}
63SDMemTable::SDMemTable(const std::string& name) :
64  IFSel_(0),
65  beamSel_(0),
66  polSel_(0) {
67  name_ = String(name);
68  Table tab(name_);
69  table_ = tab.copyToMemoryTable(name_);
70}
71
72SDMemTable::SDMemTable(const SDMemTable& other, Bool clear) {
73  this->IFSel_= other.IFSel_;
74  this->beamSel_= other.beamSel_;
75  this->polSel_= other.polSel_;
76  this->chanMask_ = other.chanMask_;
77  this->name_ = String("dummy");
78  this->table_ = other.table_.copyToMemoryTable(String("dummy"));
79  // clear all rows()
80  if (clear) {
81    this->table_.removeRow(this->table_.rowNumbers());
82  } else {
83    this->IFSel_ = other.IFSel_;
84    this->beamSel_ = other.beamSel_;
85    this->polSel_ = other.polSel_;
86  }
87}
88
89SDMemTable::SDMemTable(const Table& tab, Int scanID) :
90  IFSel_(0),
91  beamSel_(0),
92  polSel_(0) {
93  name_ = String("SDMemTable");
94  String exprs = String("select * from $1 where SCANID == ")
95    +String::toString(scanID);
96  cerr << exprs << endl;
97  Table t = tableCommand(exprs,tab);
98  table_ = t.copyToMemoryTable(name_);
99}
100
101SDMemTable::~SDMemTable(){
102  cerr << "goodbye from SDMemTable @ " << this << endl;
103}
104
105SDMemTable SDMemTable::getScan(Int scanID) {
106  return SDMemTable(table_, scanID);
107}
108
109void SDMemTable::setup() {
110  TableDesc td("", "1", TableDesc::Scratch);
111  td.comment() = "A SDMemTable";
112  td.addColumn(ScalarColumnDesc<Double>("TIME"));
113  td.addColumn(ScalarColumnDesc<String>("SRCNAME"));
114  td.addColumn(ArrayColumnDesc<Float>("SPECTRA"));
115  td.addColumn(ArrayColumnDesc<uChar>("FLAGTRA"));
116  td.addColumn(ArrayColumnDesc<Float>("TSYS")); 
117  td.addColumn(ScalarColumnDesc<Int>("SCANID")); 
118  td.addColumn(ScalarColumnDesc<Double>("INTERVAL")); 
119  // Now create a new table from the description.
120
121  SetupNewTable aNewTab(name_, td, Table::New);
122  table_ = Table(aNewTab, Table::Memory, 0); 
123}
124
125std::string SDMemTable::name() const {
126  return name_;
127}
128
129std::string SDMemTable::getSourceName(Int whichRow) const {
130  ROScalarColumn<String> src(table_, "SRCNAME");
131  String name;
132  src.get(whichRow, name);
133  return name;
134}
135
136Double SDMemTable::getTime(Int whichRow) const {
137  ROScalarColumn<Double> src(table_, "TIME");
138  Double tm;
139  src.get(whichRow, tm);
140  return tm;
141}
142
143bool SDMemTable::setIF(Int whichIF) {
144  //if ( whichIF >= 0 && whichIF < nIF_) {
145    IFSel_ = whichIF;
146    return true;
147    //}
148    //return false;
149}
150bool SDMemTable::setBeam(Int whichBeam) {
151  //if ( whichBeam >= 0 && whichBeam < nBeam_) {
152    beamSel_ = whichBeam;
153    return true;
154    //}
155    //return false;
156
157}
158bool SDMemTable::setPol(Int whichPol) {
159  //if ( whichPol >= 0 && whichPol < nPol_) {
160    polSel_ = whichPol;
161    return true;
162    //}
163    //return false;
164}
165
166bool SDMemTable::setMask(const std::vector<int>& whichChans) {
167  ROArrayColumn<uChar> spec(table_, "FLAGTRA");
168 
169  std::vector<int>::iterator it;
170  uInt n = spec.shape(0)(3);
171  chanMask_.resize(n,true);
172  for (it = whichChans.begin(); it != whichChans.end(); it++) {
173    if (*it < n)
174      chanMask_[*it] = false;
175  }
176  return true;
177}
178
179std::vector<bool> SDMemTable::getMask(Int whichRow) const {
180  std::vector<bool> mask;
181  ROArrayColumn<uChar> spec(table_, "FLAGTRA");
182  Array<uChar> arr;
183  spec.get(whichRow, arr);
184  ArrayAccessor<uChar, Axis<0> > aa0(arr);
185  aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
186  ArrayAccessor<uChar, Axis<1> > aa1(aa0);
187  aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
188  ArrayAccessor<uChar, Axis<2> > aa2(aa1);
189  aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
190
191  Bool useUserMask = ( chanMask_.size() == arr.shape()(3) );
192
193  std::vector<bool> tmp;
194  tmp = chanMask_; // WHY the fxxx do I have to make a copy here
195  std::vector<bool>::iterator miter;
196  miter = tmp.begin();
197
198  for (ArrayAccessor<uChar, Axis<3> > i(aa2); i != i.end(); ++i) {
199    bool out =!static_cast<bool>(*i);
200    if (useUserMask) {
201      out = out && (*miter);
202      miter++;
203    }
204    mask.push_back(out);
205  } 
206  return mask;
207}
208std::vector<float> SDMemTable::getSpectrum(Int whichRow) const {
209
210  std::vector<float> spectrum;
211  ROArrayColumn<Float> spec(table_, "SPECTRA");
212  Array<Float> arr;
213  spec.get(whichRow, arr);
214  ArrayAccessor<Float, Axis<0> > aa0(arr);
215  aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
216  ArrayAccessor<Float, Axis<1> > aa1(aa0);
217  aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
218  ArrayAccessor<Float, Axis<2> > aa2(aa1);
219  aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
220  for (ArrayAccessor<Float, Axis<3> > i(aa2); i != i.end(); ++i) {
221    spectrum.push_back(*i);
222  }
223  return spectrum;
224}
225
226MaskedArray<Float> SDMemTable::rowAsMaskedArray(uInt whichRow,
227                                                Bool useSelection) {
228  ROArrayColumn<Float> spec(table_, "SPECTRA");
229  Array<Float> arr;
230  ROArrayColumn<uChar> flag(table_, "FLAGTRA");
231  Array<uChar> farr;
232  spec.get(whichRow, arr);
233  flag.get(whichRow, farr);
234  Array<Bool> barr(farr.shape());convertArray(barr, farr);
235  MaskedArray<Float> marr;
236  if (useSelection) {
237    ArrayAccessor<Float, Axis<0> > aa0(arr);
238    aa0.reset(aa0.begin(uInt(beamSel_)));//go to beam
239    ArrayAccessor<Float, Axis<1> > aa1(aa0);
240    aa1.reset(aa1.begin(uInt(IFSel_)));// go to IF
241    ArrayAccessor<Float, Axis<2> > aa2(aa1);
242    aa2.reset(aa2.begin(uInt(polSel_)));// go to pol
243   
244    ArrayAccessor<Bool, Axis<0> > baa0(barr);
245    baa0.reset(baa0.begin(uInt(beamSel_)));//go to beam
246    ArrayAccessor<Bool, Axis<1> > baa1(baa0);
247    baa1.reset(baa1.begin(uInt(IFSel_)));// go to IF
248    ArrayAccessor<Bool, Axis<2> > baa2(baa1);
249    baa2.reset(baa2.begin(uInt(polSel_)));// go to pol
250
251    Vector<Float> a(arr.shape()(3));
252    Vector<Bool> b(barr.shape()(3));
253    ArrayAccessor<Float, Axis<0> > a0(a);
254    ArrayAccessor<Bool, Axis<0> > b0(b);
255
256    ArrayAccessor<Bool, Axis<3> > j(baa2);
257    for (ArrayAccessor<Float, Axis<3> > i(aa2); i != i.end(); ++i) {
258      (*a0) = (*i);
259      (*b0) = !(*j);
260      j++;
261      a0++;
262      b0++;
263    }
264    marr.setData(a,b);
265  } else {
266    marr.setData(arr,!barr);
267  }
268  return marr;
269}
270
271Float SDMemTable::getTsys(Int whichRow) const {
272  ROArrayColumn<Float> ts(table_, "TSYS");
273  Array<Float> arr;
274  ts.get(whichRow, arr);
275  Float out;
276  IPosition ip(arr.shape());
277  ip(0) = beamSel_;ip(1) = IFSel_;ip(2) = polSel_;ip(3)=0;
278  out = arr(ip);
279  return out;
280}
281
282bool SDMemTable::putSDContainer(const SDContainer& sdc) {
283  ScalarColumn<Double> mjd(table_, "TIME");
284  ScalarColumn<String> srcn(table_, "SRCNAME");
285  ArrayColumn<Float> spec(table_, "SPECTRA");
286  ArrayColumn<uChar> flags(table_, "FLAGTRA");
287  ArrayColumn<Float> ts(table_, "TSYS");
288  ScalarColumn<Int> scan(table_, "SCANID");
289  ScalarColumn<Double> integr(table_, "INTERVAL");
290
291  uInt rno = table_.nrow();
292  table_.addRow();
293 
294  mjd.put(rno, sdc.timestamp);
295  srcn.put(rno, sdc.sourcename);
296  spec.put(rno, sdc.getSpectrum());
297  flags.put(rno, sdc.getFlags());
298  ts.put(rno, sdc.getTsys());
299  scan.put(rno, sdc.scanid);
300  integr.put(rno, sdc.interval);
301 
302  return true;
303}
304
305bool SDMemTable::putSDHeader(const SDHeader& sdh) {
306  table_.lock();
307  table_.rwKeywordSet().define("nIF", sdh.nif);
308  table_.rwKeywordSet().define("nBeam", sdh.nbeam);
309  table_.rwKeywordSet().define("nPol", sdh.npol);
310  table_.rwKeywordSet().define("nChan", sdh.nchan);
311  table_.rwKeywordSet().define("Observer", sdh.observer);
312  table_.rwKeywordSet().define("Project", sdh.project);
313  table_.rwKeywordSet().define("Obstype", sdh.obstype);
314  table_.rwKeywordSet().define("AntennaName", sdh.antennaname);
315  table_.rwKeywordSet().define("AntennaPosition", sdh.antennaposition);
316  table_.rwKeywordSet().define("Equinox", sdh.equinox);
317  table_.rwKeywordSet().define("FreqRefFrame", sdh.freqref);
318  table_.rwKeywordSet().define("FreqRefVal", sdh.reffreq);
319  table_.rwKeywordSet().define("Bandwidth", sdh.bandwidth);
320  table_.rwKeywordSet().define("UTC", sdh.utc);
321  table_.unlock();
322  cerr << "Table Header set" << endl;
323  return true;
324}
325
326void SDMemTable::makePersistent(const std::string& filename) {
327  table_.deepCopy(filename,Table::New);
328}
329
330void SDMemTable::summary() const {
331  ROScalarColumn<Int> scans(table_, "SCANID");
332  ROScalarColumn<String> srcs(table_, "SRCNAME");
333  cout << "*************** Header ***************" << endl;
334  cout << "nBeam = " << nBeam() << "\t"
335       << "nIF   = " << nIF() << endl
336       << "nPol  = " << nPol() << "\t"
337       << "nChan = " << nChan() << "\t" << endl;
338  cout << "*************** Header ***************" << endl;
339  uInt count = 0;
340  String name;
341  Int previous = -1;Int current=0;
342  cout << "Scan\tSource" << endl;
343  for (uInt i=0; i< scans.nrow();i++) {
344    scans.getScalar(i,current);
345    if (previous != current) {
346      srcs.getScalar(i,name);
347      previous = current;     
348      count++;
349      cout << count << "\t"
350           << name
351           << endl;
352    }
353  }
354  cout << "Table contains " << table_.nrow() << " integration(s)." << endl;
355  cout << "in " << count << " scan(s)." << endl;
356}
357
358Int SDMemTable::nBeam() const {
359  Int n;
360  table_.keywordSet().get("nBeam",n);
361  return n;
362}
363Int SDMemTable::nIF() const {
364  Int n;
365  table_.keywordSet().get("nIF",n);
366  return n;
367}
368Int SDMemTable::nPol() const {
369  Int n;
370  table_.keywordSet().get("nPol",n);
371  return n;
372}
373Int SDMemTable::nChan() const {
374  Int n;
375  table_.keywordSet().get("nChan",n);
376  return n;
377}
378
379/*
380void SDMemTable::maskChannels(const std::vector<Int>& whichChans ) {
381 
382  std::vector<int>::iterator it;
383  ArrayAccessor<uChar, Axis<2> > j(flags_);
384  for (it = whichChans.begin(); it != whichChans.end(); it++) {
385    j.reset(j.begin(uInt(*it)));
386    for (ArrayAccessor<uChar, Axis<0> > i(j); i != i.end(); ++i) {
387      for (ArrayAccessor<uChar, Axis<1> > ii(i); ii != ii.end(); ++ii) {
388        for (ArrayAccessor<uChar, Axis<3> > iii(ii);
389             iii != iii.end(); ++iii) {   
390          (*iii) =
391        }
392      }
393    }
394  }
395 
396}
397*/
Note: See TracBrowser for help on using the repository browser.