source: trunk/src/FillerBase.cpp @ 2230

Last change on this file since 2230 was 2230, checked in by Takeshi Nakazato, 13 years ago

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes/No?

Module(s): Module Names change impacts.

Description: Describe your changes here...

FIT_ID is -1 by default.


File size: 8.6 KB
Line 
1//
2// C++ Interface: FillerBase
3//
4// Description:
5//
6//
7// Author: Malte Marquarding <asap@atnf.csiro.au>, (C) 2010
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12
13#include <casa/Containers/RecordField.h>
14#include <tables/Tables/ExprNode.h>
15
16#include "FillerBase.h"
17
18using namespace casa;
19
20namespace asap {
21
22FillerBase::FillerBase(casa::CountedPtr<Scantable> stable) :
23  table_(stable)
24{
25    row_ = TableRow(table_->table());
26
27    // FIT_ID is -1 by default
28    RecordFieldPtr<Int> fitIdCol( row_.record(), "FIT_ID" ) ;
29    *fitIdCol = -1 ;
30}
31
32void FillerBase::setHeader(const STHeader& header)
33{
34  table_->setHeader(header);
35}
36
37void FillerBase::setSpectrum(const Vector<Float>& spectrum,
38                             const Vector<uChar>& flags,
39                             const Vector<Float>& tsys)
40{
41  RecordFieldPtr< Array<Float> > specCol(row_.record(), "SPECTRA");
42  RecordFieldPtr< Array<uChar> > flagCol(row_.record(), "FLAGTRA");
43  RecordFieldPtr< Array<Float> > tsysCol(row_.record(), "TSYS");
44
45  //*specCol = spectrum;
46  //*flagCol = flags;
47  //*tsysCol = tsys;
48  specCol.define(spectrum);
49  flagCol.define(flags);
50  tsysCol.define(tsys);
51}
52
53void FillerBase::setFlagrow(uInt flag)
54{
55  RecordFieldPtr<uInt> flagrowCol(row_.record(), "FLAGROW");
56  *flagrowCol = flag;
57}
58
59void FillerBase::setOpacity(Float opacity)
60{
61  RecordFieldPtr<Float> tauCol(row_.record(), "OPACITY") ;
62  *tauCol = opacity ;
63}
64
65void FillerBase::setIndex(uInt scanno, uInt cycleno, uInt ifno, uInt polno,
66                          uInt beamno)
67{
68  RecordFieldPtr<uInt> beamCol(row_.record(), "BEAMNO");
69  RecordFieldPtr<uInt> ifCol(row_.record(), "IFNO");
70  RecordFieldPtr<uInt> polCol(row_.record(), "POLNO");
71  RecordFieldPtr<uInt> cycleCol(row_.record(), "CYCLENO");
72  RecordFieldPtr<uInt> scanCol(row_.record(), "SCANNO");
73  *beamCol = beamno;
74  *cycleCol = cycleno;
75  *ifCol = ifno;
76  *polCol = polno;
77  *scanCol = scanno;
78}
79
80void FillerBase::setFrequency(Double refpix, Double refval,
81                              Double incr)
82{
83  /// @todo this has to change when nchan isn't global anymore
84  uInt id= table_->frequencies().addEntry(refpix, refval, incr);
85  RecordFieldPtr<uInt> mfreqidCol(row_.record(), "FREQ_ID");
86  *mfreqidCol = id;
87
88}
89
90
91void FillerBase::setMolecule(const Vector<Double>& restfreq)
92{
93  Vector<String> tmp;
94  uInt id = table_->molecules().addEntry(restfreq, tmp, tmp);
95  RecordFieldPtr<uInt> molidCol(row_.record(), "MOLECULE_ID");
96  *molidCol = id;
97}
98
99void FillerBase::setDirection(const Vector<Double>& dir,
100                              Float az, Float el)
101{
102  RecordFieldPtr<Array<Double> > dirCol(row_.record(), "DIRECTION");
103  *dirCol = dir;
104  RecordFieldPtr<Float> azCol(row_.record(), "AZIMUTH");
105  *azCol = az;
106  RecordFieldPtr<Float> elCol(row_.record(), "ELEVATION");
107  *elCol = el;
108}
109
110void FillerBase::setFocus(Float pa, Float faxis,
111                      Float ftan, Float frot)
112{
113  RecordFieldPtr<uInt> mfocusidCol(row_.record(), "FOCUS_ID");
114  uInt id = table_->focus().addEntry(pa, faxis, ftan, frot);
115  *mfocusidCol = id;
116}
117
118void FillerBase::setTime(Double mjd, Double interval)
119{
120    RecordFieldPtr<Double> mjdCol(row_.record(), "TIME");
121    *mjdCol = mjd;
122    RecordFieldPtr<Double> intCol(row_.record(), "INTERVAL");
123    *intCol = interval;
124
125}
126
127void FillerBase::setWeather(Float temperature, Float pressure,
128                        Float humidity,
129                        Float windspeed, Float windaz)
130{
131    uInt id = table_->weather().addEntry(temperature, pressure,
132                                         humidity, windspeed, windaz);
133    RecordFieldPtr<uInt> mweatheridCol(row_.record(), "WEATHER_ID");
134    *mweatheridCol = id;
135}
136
137void FillerBase::setTcal(const String& tcaltime,
138                     const Vector<Float>& tcal)
139{
140    uInt id = table_->tcal().addEntry(tcaltime, tcal);
141    RecordFieldPtr<uInt> mcalidCol(row_.record(), "TCAL_ID");
142    *mcalidCol = id;
143}
144
145void FillerBase::setScanRate(const Vector<Double>& srate)
146{
147    RecordFieldPtr<Array<Double> > srateCol(row_.record(), "SCANRATE");
148    *srateCol = srate;
149}
150
151void FillerBase::setReferenceBeam(Int beamno)
152{
153  RecordFieldPtr<Int> rbCol(row_.record(), "REFBEAMNO");
154  *rbCol = beamno;
155}
156
157void FillerBase::setSource(const std::string& name, Int type,
158                           const std::string& fieldname,
159                           const Vector<Double>& dir,
160                           const Vector<Double>& propermot,
161                           Double velocity)
162{
163    RecordFieldPtr<String> srcnCol(row_.record(), "SRCNAME");
164    *srcnCol = name;
165    RecordFieldPtr<Int> srctCol(row_.record(), "SRCTYPE");
166    *srctCol = type;
167    RecordFieldPtr<String> fieldnCol(row_.record(), "FIELDNAME");
168    *fieldnCol = fieldname;
169    RecordFieldPtr<Array<Double> > spmCol(row_.record(), "SRCPROPERMOTION");
170    *spmCol = propermot;
171    RecordFieldPtr<Array<Double> > sdirCol(row_.record(), "SRCDIRECTION");
172    *sdirCol = dir;
173    RecordFieldPtr<Double> svelCol(row_.record(), "SRCVELOCITY");
174    *svelCol = velocity;
175}
176
177void FillerBase::commitRow()
178{
179  table_->table().addRow();
180  row_.put(table_->table().nrow()-1);
181}
182
183void FillerBase::setWeather2(Float temperature,
184                             Float pressure,
185                             Float humidity,
186                             Float windspeed,
187                             Float windaz)
188{
189  uInt id ;
190  Table tab = table_->weather().table() ;
191  Table subt = tab( tab.col("TEMPERATURE") == temperature \
192                    && tab.col("PRESSURE") == pressure \
193                    && tab.col("HUMIDITY") == humidity \
194                    && tab.col("WINDSPEED") == windspeed \
195                    && tab.col("WINDAZ") == windaz ) ;
196  Int nrow = tab.nrow() ;
197  Int nrowSel = subt.nrow() ;
198  if ( nrowSel == 0 ) {
199    tab.addRow( 1, True ) ;
200    TableRow row( tab ) ;
201    TableRecord &rec = row.record() ;
202    RecordFieldPtr<casa::uInt> rfpi ;
203    rfpi.attachToRecord( rec, "ID" ) ;
204    *rfpi = (uInt)nrow ;
205    RecordFieldPtr<casa::Float> rfp ;
206    rfp.attachToRecord( rec, "TEMPERATURE" ) ;
207    *rfp = temperature ;
208    rfp.attachToRecord( rec, "PRESSURE" ) ;
209    *rfp = pressure ;
210    rfp.attachToRecord( rec, "HUMIDITY" ) ;
211    *rfp = humidity ;
212    rfp.attachToRecord( rec, "WINDSPEED" ) ;
213    *rfp = windspeed ;
214    rfp.attachToRecord( rec, "WINDAZ" ) ;
215    *rfp = windaz ;
216    row.put( nrow, rec ) ;
217    id = (uInt)nrow ;
218  }
219  else {
220    ROTableColumn tc( subt, "ID" ) ;
221    id = tc.asuInt( 0 ) ;
222  }
223  RecordFieldPtr<uInt> mweatheridCol(row_.record(), "WEATHER_ID");
224  *mweatheridCol = id;
225}
226
227void FillerBase::setTcal2(const String& tcaltime,
228                          const Vector<Float>& tcal)
229{
230  uInt id ;
231  Table tab = table_->tcal().table() ;
232  Int nrow = tab.nrow() ;
233  Vector<uInt> rowList( 0 ) ;
234  ArrayColumn<Float> tcalCol( tab, "TCAL" ) ;
235  TableColumn timeCol( tab, "TIME" ) ;
236  TableColumn idCol( tab, "ID" ) ;
237  uInt nelem = tcal.nelements() ;
238  for ( Int irow = 0 ; irow < nrow ; irow++ ) {
239    if ( tcalCol.shape(irow)[0] == nelem ) {
240      rowList.resize( rowList.nelements()+1, True ) ;
241      rowList[rowList.nelements()-1] = irow ;
242    }
243  }
244 
245  //cout << "rowList = " << rowList << endl ;
246
247  if ( rowList.nelements() == 0 ) {
248    // add new row
249    tab.addRow( 1 ) ;
250    //cout << "tab.nrow() = " << tab.nrow() << endl ;
251    tcalCol.put( nrow, tcal ) ;
252    timeCol.putScalar( nrow, tcaltime ) ;
253    id = (uInt)nrow ;
254    idCol.putScalar( nrow, id ) ;
255  }
256  else {
257    uInt ichan = 0 ;
258    while ( rowList.nelements() > 1 && ichan < nelem ) {
259      Vector<uInt> tmp = rowList.copy() ;
260      rowList.resize( 0 ) ;
261      for ( uInt irow = 0 ; irow < tmp.nelements() ; irow++ ) {
262        Vector<Float> t = tcalCol( tmp[irow] ) ;
263        if ( t[ichan] == tcal[ichan] ) {
264          rowList.resize( rowList.nelements()+1, True ) ;
265          rowList[rowList.nelements()-1] = irow ;
266        }
267      }
268      ichan++ ;
269    }
270   
271    //cout << "updated rowList = " << rowList << endl ;
272
273    if ( rowList.nelements() == 0 ) {
274      // add new row
275      tab.addRow( 1, True ) ;
276      //cout << "tab.nrow() = " << tab.nrow() << endl ;
277      tcalCol.put( nrow, tcal ) ;
278      timeCol.putScalar( nrow, tcaltime ) ;
279      id = (uInt)nrow ;
280      idCol.putScalar( nrow, id ) ;
281    }
282    else {
283      Vector<Float> t = tcalCol( rowList[0] ) ;
284      if ( allEQ( t, tcal ) ) {
285        ROTableColumn tc( tab, "ID" ) ;
286        id = tc.asuInt( rowList[0] ) ;
287      }
288      else {
289        // add new row
290        tab.addRow( 1, True ) ;
291        //cout << "tab.nrow() = " << tab.nrow() << endl ;
292        tcalCol.put( nrow, tcal ) ;
293        timeCol.putScalar( nrow, tcaltime ) ;
294        id = (uInt)nrow ;
295        idCol.putScalar( nrow, id ) ;
296      }
297    }
298  }
299 
300  RecordFieldPtr<uInt> mcalidCol(row_.record(), "TCAL_ID");
301  *mcalidCol = id;
302}
303
304};
Note: See TracBrowser for help on using the repository browser.