Changeset 2963 for trunk/src


Ignore:
Timestamp:
06/30/14 12:46:50 (10 years ago)
Author:
Takeshi Nakazato
Message:

New Development: No

JIRA Issue: Yes CAS-6585, CAS-6571

Ready for Test: Yes

Interface Changes: Yes/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...

STApplyCal is updated so that it takes into account channel flag information
when data is interpolated in time and in frequency.


Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/STApplyCal.cpp

    r2960 r2963  
    4545using namespace std;
    4646
     47namespace {
     48// utility functions
     49Vector<uInt> indexSort(Vector<Double> &t)
     50{
     51  Sort sort;
     52  sort.sortKey(&t[0], TpDouble, 0, Sort::Ascending);
     53  Vector<uInt> idx;
     54  sort.sort(idx, t.nelements(), Sort::QuickSort|Sort::NoDuplicates);
     55  return idx;
     56}
     57
     58void getSortedData(const Vector<Double> key, const Vector<Float> data,
     59                   const Vector<uChar> flag,
     60                   Vector<Double> sortedKey, Vector<Float> sortedData,
     61                   Vector<uChar> sortedFlag)
     62{
     63}
     64}
     65
    4766namespace asap {
    48 
    4967STApplyCal::STApplyCal()
    5068{
     
    292310      uInt nrowThisTsys = tsystable_[i]->nrow();
    293311      nrowTsys += nrowThisTsys;
    294       if (nrowThisTsys > 0 and nchanTsys == 0) {
     312      if (nrowThisTsys > 0 && nchanTsys == 0) {
    295313        nchanTsys = tsystable_[i]->nchan(tsysifno);
    296314        ftsys = tsystable_[i]->getBaseFrequency(0);
     
    323341    }
    324342   
    325     Vector<uInt> skyIdx = timeSort(timeSky);
     343    Vector<uInt> skyIdx = indexSort(timeSky);
    326344    nrowSkySorted = skyIdx.nelements();
    327345   
     
    371389      }
    372390    }
    373     Vector<uInt> tsysIdx = timeSort(timeTsys);
     391    Vector<uInt> tsysIdx = indexSort(timeTsys);
    374392    nrowTsysSorted = tsysIdx.nelements();
    375393
     
    407425  // Array for interpolated off spectrum
    408426  Vector<Float> iOff(IPosition(1, nchanSp), new Float[nchanSp], TAKE_OVER);
     427
     428  // working array for interpolation with flags
     429  uInt arraySize = max(max(nrowTsysSorted, nchanTsys), nrowSkySorted);
     430  Vector<Double> xwork(IPosition(1, arraySize), new Double[arraySize], TAKE_OVER);
     431  Vector<Float> ywork(IPosition(1, arraySize), new Float[arraySize], TAKE_OVER);
     432  Vector<uChar> fwork(IPosition(1, nchanTsys), new uChar[nchanTsys], TAKE_OVER);
    409433 
    410434  for (uInt i = 0; i < rows.nelements(); i++) {
     
    420444    // interpolation
    421445    Double t0 = timeCol(irow);
     446    Double *xwork_p = xwork.data();
     447    Float *ywork_p = ywork.data();
    422448    for (uInt ichan = 0; ichan < nchanSp; ichan++) {
    423449      Float *tmpY = &(spoffSorted.data()[ichan * nrowSkySorted]);
    424       if (allNE(flagoffSorted.column(ichan), (uChar)0)) {
     450      uChar *tmpF = &(flagoffSorted.data()[ichan * nrowSkySorted]);
     451      uInt wnrow = 0;
     452      for (uInt ir = 0; ir < nrowSkySorted; ++ir) {
     453        if (tmpF[ir] == 0) {
     454          xwork_p[wnrow] = timeSkySorted.data()[ir];
     455          ywork_p[wnrow] = tmpY[ir];
     456          wnrow++;
     457        }
     458      }
     459      //if (allNE(flagoffSorted.column(ichan), (uChar)0)) {
     460      if (wnrow > 0) {
     461        // any valid reference data
     462        interpolatorS_->setData(xwork_p, ywork_p, wnrow);
     463      }
     464      else {
     465        // no valid reference data
     466        // interpolate data regardless of flag
     467        interpolatorS_->setData(timeSkySorted.data(), tmpY, nrowSkySorted);
     468        // flag this channel for calibrated data
    425469        flag[ichan] = 1 << 7; // user flag
    426470      }
    427       interpolatorS_->setY(tmpY, nrowSkySorted);
     471      //interpolatorS_->setY(tmpY, nrowSkySorted);
    428472      iOff[ichan] = interpolatorS_->interpolate(t0);
    429473    }
     
    433477    if (doTsys) {
    434478      // Tsys correction
     479      // interpolation on time axis
    435480      Float *yt = iTsysT.data();
     481      uChar *fwork_p = fwork.data();
    436482      for (uInt ichan = 0; ichan < nchanTsys; ichan++) {
    437483        Float *tmpY = &(tsysSorted.data()[ichan * nrowTsysSorted]);
    438         interpolatorT_->setY(tmpY, nrowTsysSorted);
    439         iTsysT[ichan] = interpolatorT_->interpolate(t0);
     484        uChar *tmpF = &(flagtsysSorted.data()[ichan * nrowTsysSorted]);
     485        uInt wnrow = 0;
     486        for (uInt ir = 0; ir < nrowTsysSorted; ++ir) {
     487          if (tmpF[ir] == 0) {
     488            xwork_p[wnrow] = timeTsysSorted.data()[ir];
     489            ywork_p[wnrow] = tmpY[ir];
     490            wnrow++;
     491          }
     492        }
     493        if (wnrow > 0) {
     494          // any valid value exists
     495          //interpolatorT_->setY(tmpY, nrowTsysSorted);
     496          interpolatorT_->setData(xwork_p, ywork_p, wnrow);
     497          iTsysT[ichan] = interpolatorT_->interpolate(t0);
     498          fwork_p[ichan] = 0;
     499        }
     500        else {
     501          // no valid data
     502          fwork_p[ichan] = 1 << 7; // user flag
     503        }
    440504      }
    441505      if (nchanSp == 1) {
     
    446510        // interpolation on frequency axis
    447511        Vector<Double> fsp = getBaseFrequency(rows[i]);
    448         interpolatorF_->setY(yt, nchanTsys);
     512        uInt wnchan = 0;
     513        for (uInt ichan = 0; ichan < nchanTsys; ++ichan) {
     514          if (fwork_p[ichan] == 0) {
     515            xwork_p[wnchan] = ftsys.data()[ichan];
     516            ywork_p[wnchan] = yt[ichan];
     517            ++wnchan;
     518          }
     519        }
     520        //interpolatorF_->setY(yt, nchanTsys);
     521        interpolatorF_->setData(xwork_p, ywork_p, wnchan);
    449522        for (uInt ichan = 0; ichan < nchanSp; ichan++) {
    450523          iTsys[ichan] = interpolatorF_->interpolate(fsp[ichan]);
     
    488561  interpolatorF_->reset();
    489562  interpolatorT_->reset();
    490 }
    491 
    492 Vector<uInt> STApplyCal::timeSort(Vector<Double> &t)
    493 {
    494   Sort sort;
    495   sort.sortKey(&t[0], TpDouble, 0, Sort::Ascending);
    496   Vector<uInt> idx;
    497   sort.sort(idx, t.nelements(), Sort::QuickSort|Sort::NoDuplicates);
    498   return idx;
    499563}
    500564
     
    629693  }
    630694}
    631 }
     695
     696}
  • trunk/src/STApplyCal.h

    r2756 r2963  
    9696  casa::Vector<casa::Double> getBaseFrequency(casa::uInt whichrow);
    9797
    98   // time sort
    99   casa::Vector<casa::uInt> timeSort(casa::Vector<casa::Double> &t);
    100 
    10198  // search spwmap_ to get IFNO for Tsys
    10299  casa::uInt getIFForTsys(casa::uInt to);
Note: See TracChangeset for help on using the changeset viewer.