LCOV - code coverage report
Current view: top level - msvis/MSVis - MsAverager.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 679 0.0 %
Date: 2024-10-29 13:38:20 Functions: 0 19 0.0 %

          Line data    Source code
       1             : //# MsAverager.cc: Implementation of MsAverager.h
       2             : //# Copyright (C) 1996,1997,1998,1999,2000,2002,2003
       3             : //# Associated Universities, Inc. Washington DC, USA.
       4             : //#
       5             : //# This library is free software; you can redistribute it and/or modify it
       6             : //# under the terms of the GNU Library General Public License as published by
       7             : //# the Free Software Foundation; either version 2 of the License, or (at your
       8             : //# option) any later version.
       9             : //#
      10             : //# This library is distributed in the hope that it will be useful, but WITHOUT
      11             : //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12             : //# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
      13             : //# License for more details.
      14             : //#
      15             : //# You should have received a copy of the GNU Library General Public License
      16             : //# along with this library; if not, write to the Free Software Foundation,
      17             : //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
      18             : //#
      19             : //# Correspondence concerning AIPS++ should be addressed as follows:
      20             : //#        Internet email: casa-feedback@nrao.edu.
      21             : //#        Postal address: AIPS++ Project Office
      22             : //#                        National Radio Astronomy Observatory
      23             : //#                        520 Edgemont Road
      24             : //#                        Charlottesville, VA 22903-2475 USA
      25             : //#
      26             : //# $Id$
      27             : //----------------------------------------------------------------------------
      28             : 
      29             : 
      30             : #include <msvis/MSVis/SelectAverageSpw.h>
      31             : #include <msvis/MSVis/MsAverager.h>
      32             : #include <casacore/casa/Exceptions/Error.h>
      33             : #include <casacore/casa/Arrays/ArrayMath.h>
      34             : #include <casacore/casa/Arrays/Slice.h>
      35             : #include <casacore/casa/OS/Timer.h>
      36             : #include <iomanip>
      37             : 
      38             : #include <stdio.h>
      39             : #include <stdlib.h>
      40             : #include <errno.h>
      41             : #include <iostream>
      42             : #include <iomanip>
      43             : #include <cmath>
      44             : 
      45             : #define LOG2 0
      46             : 
      47             : #if LOG2
      48             : #define IfLog2(x) x
      49             : #else
      50             : #define IfLog2(x) /*x*/
      51             : #endif
      52             : 
      53             : using namespace casacore;
      54             : namespace casa { 
      55             : 
      56             : const String MsAverager::clname = "MsAverager";
      57             : 
      58             : const String MsAverager::DataColumn[] = {"DATA", "CORRECTEDDATA", 
      59             :                                          "MODELDATA", "RESIDUAL"};
      60             : 
      61           0 : MsAverager::MsAverager(MS* ms, OutputMode mode) {
      62           0 :    aveOK = false;
      63             : 
      64             :    //log = SLog::slog();
      65           0 :    reset(ms, mode);
      66           0 : }
      67             : 
      68           0 : void MsAverager::reset(MS* ms, OutputMode mode) {
      69             :    //cout << "MS=" << *ms << endl;
      70           0 :    aveOK = false;
      71           0 :    outputMode = mode;
      72             : 
      73           0 :    if (!ms) {
      74           0 :            LogIO os(LogOrigin("MsAverager", "reset"));
      75           0 :            os << LogIO::WARN << "Could not reset MsAverager: input MS is NULL" << LogIO::POST;
      76             :       //SLog::slog()->out("Could not reset MsAverager: input MS is NULL",
      77             :                 //"MsAverager", clname, LogMessage::WARN, true);    
      78           0 :       return;
      79           0 :    }
      80             : 
      81             :    //SLog::slog()->out(String("Number of selected rows is ") + 
      82             :     //             String::toString(ms->nrow()),
      83             :      //           "MsAverager", clname, LogMessage::DEBUG1);    
      84             : 
      85           0 :    pMS = ms;
      86           0 :    vs = 0;
      87           0 :    pAveBuff = 0;
      88             : 
      89           0 :    spw.resize(0);
      90             : 
      91             :    //Block<int> sort(4);
      92             :    //sort[0] = MS::DATA_DESC_ID;
      93             :    //sort[1] = MS::FIELD_ID;
      94             :    //sort[2] = MS::TIME;
      95             :    //sort[3] = MS::ARRAY_ID;
      96             : 
      97             :    //Matrix<Int> allChannels;
      98             :    //Double intrvl = 2;
      99             :    //vs = new VisSet(*pMS, sort, allChannels, intrvl);
     100             : 
     101           0 :    TableDesc td = pMS->tableDesc();
     102           0 :    String aveTable=String("casapy.scratch-0.table");
     103           0 :    if (!Table::isOpened(aveTable)) {
     104           0 :       SetupNewTable aveSetup(aveTable, td, Table::Scratch);
     105           0 :       StManAipsIO stm;
     106           0 :       aveSetup.bindAll(stm);
     107             : 
     108             :       //if (mspointer!=NULL) delete mspointer;
     109             :       //mspointer=0;
     110             :       //MS* mspointer= SubMS::setupMS(aveTable, 10, 4, "VLA");
     111             :       //aMS=*mspointer;
     112             : 
     113           0 :    aMS = MS();
     114           0 :       aMS = MS(aveSetup, 0, false);
     115           0 :       msc = new MSColumns(aMS);
     116             :       //cout << "---aMS=" << aMS << endl;
     117           0 :    }
     118             : 
     119           0 :    msName = pMS->tableName(); 
     120             :    //msdv = new MSDerivedValues;
     121             :    //msdv->setMeasurementSet(*pMS);
     122             :    //msdv->setVelocityReference(MDoppler::RADIO);
     123             :    //msdv->setFrequencyReference(MFrequency::LSRK);
     124           0 : }
     125             : 
     126           0 : MsAverager::~MsAverager() {
     127           0 :    cleanup();
     128           0 : }
     129             : 
     130           0 : void MsAverager::cleanup() {
     131           0 :    if (pMS) {
     132             :       //delete pMS;
     133           0 :       pMS = 0;
     134             :    }
     135           0 :    if (vs) {
     136             :       //delete vs;
     137           0 :       vs = 0;
     138             :    }
     139           0 :    if (msc) {
     140             :       //delete msc;
     141           0 :       msc = 0;
     142             :    }
     143           0 :    if (pAveBuff) {
     144             :       //delete pAveBuff;
     145           0 :       pAveBuff = 0;
     146             :    }  
     147           0 : }
     148             : 
     149             : 
     150           0 : void MsAverager::setAverager(
     151             :                    const Matrix<Int>& cList,
     152             :                    const Matrix<Int>& bls,
     153             :                    Double aveT, Int aveC, 
     154             :                    const String& col,
     155             :                    const String& aveM,
     156             :                    const Bool& aveF,
     157             :                    const Bool& crossscan,
     158             :                    const Bool& crossbline,
     159             :                    const Bool& crossarray,
     160             :                    const Bool& aveVelo,
     161             :                    const String& restfre,
     162             :                    const String& fram,
     163             :                    const String& doppl) {
     164           0 :     String fnname = "average";
     165             :     //static uInt loop = 0;
     166             : 
     167           0 :     for (Int i = aMS.nrow() - 1; i >= 0; i--) {
     168           0 :        aMS.removeRow(i);
     169             :     }
     170             :     //cout << "aMS rows=" << aMS.nrow() << endl;
     171             :     //showColumnNames();
     172           0 :     LogIO os(LogOrigin("MsAverager", "setAverager"));
     173           0 :     if (upcase(col)=="MODEL")
     174           0 :     if (!hasColumn("MODEL_DATA")) {
     175           0 :        os << LogIO::WARN << "The MS does not have MODEL_DATA column" << LogIO::POST;
     176           0 :        return;
     177             :     }
     178           0 :     if (upcase(col)=="CORRECTED")
     179           0 :     if (!hasColumn("CORRECTED_DATA")) {
     180           0 :        os << LogIO::WARN << "The MS does not have CORRECTED_DATA column" << LogIO::POST;
     181           0 :        return;
     182             :     }
     183           0 :     if (upcase(col)=="RESIDUAL") {
     184           0 :     if (!hasColumn("CORRECTED_DATA")) {
     185           0 :        os << LogIO::WARN << "The MS does not have CORRECTED_DATA column" << LogIO::POST;
     186           0 :        return;
     187             :     }
     188           0 :     if (!hasColumn("MODEL_DATA")) {
     189           0 :        os << LogIO::WARN << "The MS does not have MODEL_DATA column" << LogIO::POST;
     190           0 :        return;
     191             :     }
     192             :     }
     193             :        
     194           0 :     column = col;
     195           0 :     if (column == "CORRECTED") {
     196           0 :        column = "CORRECTEDDATA";
     197             :     }
     198           0 :     if (column == "MODEL") {
     199           0 :        column = "MODELDATA";
     200             :     }
     201           0 :     if (column == "RESIDUAL") {
     202           0 :        column = "RESIDUAL";
     203             :     }
     204             : 
     205           0 :     crossSpws = false;
     206           0 :     if (aveC==1234567) {
     207           0 :         crossSpws = true;
     208             :     }
     209             : 
     210           0 :     Matrix<Int> allChannels;
     211           0 :     Double intrvl = 2;
     212           0 :     if (crossSpws) {
     213             :        //cout << "crossSpws=true sort by time" << endl;
     214           0 :        Block<int> sort(2);
     215           0 :        sort[0] = MS::TIME;
     216             :        //sort[1] = MS::FIELD_ID;
     217           0 :        sort[1] = MS::DATA_DESC_ID;
     218             :        //sort[3] = MS::ARRAY_ID;
     219           0 :        vs = new VisSet(*pMS, sort, allChannels, intrvl);
     220           0 :     }
     221             :     else {    
     222             :        //cout << "crossSpws=false sort by spw" << endl;
     223           0 :        Block<int> sort(4);
     224           0 :        sort[0] = MS::DATA_DESC_ID;
     225           0 :        sort[1] = MS::FIELD_ID;
     226           0 :        sort[2] = MS::TIME;
     227           0 :        sort[3] = MS::ARRAY_ID;
     228           0 :        vs = new VisSet(*pMS, sort, allChannels, intrvl);
     229           0 :     }
     230             :     
     231           0 :     aveFlag = aveF;
     232           0 :     aveMode = aveM;
     233           0 :     aveChan = aveC;
     234           0 :     aveTime = aveT;
     235           0 :     crossScans = crossscan;
     236           0 :     crossBlines = crossbline;
     237           0 :     crossArrays = crossarray;
     238           0 :     aveVel = aveVelo;
     239           0 :     sorryVel = true;
     240             : 
     241           0 :     baselines.resize(bls.shape()[0], bls.shape()[1]);
     242           0 :     baselines = bls;
     243             : 
     244           0 :     restfreq = restfre;
     245           0 :     frame = fram;
     246           0 :     doppler = doppl;
     247             : 
     248             :     //cout 
     249             :     //     << "aveFlag=" << aveFlag << " aveMode=" << aveMode
     250             :     //     << " aveChan=" << aveChan << " aveTime=" << aveTime 
     251             :     //     << " aveC=" << aveC << " crossScans=" << crossscan 
     252             :     //     << " crossBlines=" << crossbline
     253             :     //     << " crossArrays=" << crossarray 
     254             :     //     << " crossSpws=" << crossSpws
     255             :     //     << " aveVel=" << aveVel 
     256             :     //     << " baselines=" << baselines 
     257             :     //     << " restfreq=" << restfreq 
     258             :     //     << " frame=" << frame
     259             :     //     << " doppler=" << doppler
     260             :     //     << endl;
     261             : 
     262           0 :     nAvePol = -1;
     263           0 :     if (aveChan < 1)
     264           0 :        aveChan = 1;
     265           0 :     if (aveTime < 0)
     266           0 :        aveTime = 0;
     267             : 
     268           0 :     msRow = 0;
     269             : 
     270             :     //showColumnNames();
     271             :     //if (!hasColumn(upcase(col))) {
     272             :     //   cout << "The MS does not have '" + col + "' column" << endl;
     273             :     //   return;
     274             :     //}
     275             : 
     276             :     //if (aveMode == "SCALAR" &&
     277             :     //    !((isDataColumn(xcol) && xval == "AMP") || 
     278             :     //      (isDataColumn(ycol) && yval == "AMP"))) {
     279             :     // SLog::slog()->out("Scalar everage is for amplitude of visibility only",
     280             :     //                 fnname, clname, LogMessage::WARN); 
     281             :     //    return;
     282             :     //}
     283             : 
     284           0 :     if (aveTime == 0 && aveChan == 1) {
     285             :         //SLog::slog()->out("No averaging", 
     286             :                           //fnname, clname, LogMessage::NORMAL5); 
     287           0 :         aveOK = false;
     288           0 :         return;
     289             :     }
     290             : 
     291             :     try {
     292           0 :        VisIter& vi(vs->iter());
     293           0 :        VisBuffer vb(vi);
     294             : 
     295             :        //aveRow = 0;
     296             : 
     297           0 :        Int iChunk = 0;  //count the total number of chunks
     298           0 :        Int iIter = 0;   //count the total number of iterations
     299           0 :        Int iRow = 0;    //count the total number of input rows
     300             : 
     301           0 :        Int corrs = -1;
     302           0 :        Int chans = -1;
     303           0 :        Int corrChange = 0;
     304           0 :        Int chanChange = 0;
     305             :        //cout << "before checking the shape" << endl;
     306           0 :        vi.origin();
     307           0 :        for (vi.originChunks(); vi.moreChunks(); vi.nextChunk()) {
     308           0 :          for (vi.origin(); vi.more(); vi++) {
     309             :             //cout << "corrs=" <<  vi.nCorr()
     310             :             //   << " chans=" << vb.nChannel() << endl;
     311           0 :             if (corrs != vi.nCorr()) {
     312           0 :                corrs = vi.nCorr();
     313           0 :                corrChange++;
     314             :             }
     315           0 :             if (chans != vb.nChannel()) {
     316           0 :                chans = vb.nChannel();
     317           0 :                chanChange++; 
     318             :                //cout << "chanChange=" << chanChange << endl;
     319             :             }
     320             :          }
     321             :        }
     322             :        //cout << "after checking the shape" << endl;
     323           0 :        if (chanChange > 1 || corrChange > 1) {
     324           0 :           LogIO os(LogOrigin("MsAverager", "setAverager"));
     325             :           os << LogIO::WARN << "Average over variable shape of "
     326             :              << "channel/polarization is not supported" 
     327           0 :              << LogIO::POST;
     328           0 :           aveOK = false;
     329           0 :           return;
     330           0 :        }
     331             : 
     332           0 :        Int nChan = vb.nChannel();
     333           0 :        aveChan = max(1, aveChan);
     334           0 :        aveChan = min(aveChan, nChan);
     335             : 
     336           0 :        nAveChan = 
     337           0 :            SAS::selectAverageChan(pMS, cList, spw, aveChan);
     338             :        //SAS::showSASC(spw);
     339             :        //cout << "nAveChan=" << nAveChan << endl;
     340             : 
     341           0 :        SAS::chanMap(aveChanMap, spw);
     342             :        //cout << "aveChanMap=" << aveChanMap ;
     343             :       
     344           0 :        aveRowMap.resize(pMS->nrow(), 3);
     345             :        //pMS->antenna().nrow() = vs->numberAnt()
     346             :        //due to the baseline/antenna selection, not all the 
     347             :        //antenna present in the pMS 
     348             :        //Int nAnt = (pMS->antenna().nrow());//vs->numberAnt();
     349             :        //cout << "nAnt=" << nAnt << endl;
     350             : 
     351           0 :        Int nAnt = baselines.shape()[0];
     352           0 :        nAntenna = nAnt;
     353             :        //cout << "nAnt=" << nAnt << endl;
     354             : 
     355           0 :        aveTime = max(0.01, aveTime);
     356             :        //cout << "aveTime=" << aveTime << endl;
     357           0 :        vi.setInterval(aveTime);
     358             : 
     359           0 :        nAveTime = 0;    //number of bins of time averaged buffer
     360           0 :        Int nTime = 0;   //number of integrations in the current cumulating bin 
     361           0 :        nAveRow = 0;
     362             : 
     363           0 :        Vector<Double> curTime;
     364             :        //Vector<Int> ant1;
     365             :        //Vector<Int> ant2;
     366             : 
     367           0 :        Double bufTime = -1;
     368           0 :        Bool newTime = true;
     369             : 
     370           0 :        Double sumTime = 0.;
     371           0 :        Double nextTime = -1;
     372           0 :        Int nTotalTime = 0;
     373             :       
     374           0 :        Int bufField = -1;
     375           0 :        Bool newField = true;
     376             : 
     377           0 :        Int bufScan = -1;
     378           0 :        Bool newScan = true;
     379             :  
     380           0 :        Int bufArray = -1;
     381           0 :        Bool newArray = true;
     382             : 
     383           0 :        Int bufDesc = -1;
     384           0 :        Bool newDesc = true;
     385             : 
     386             :        //timer for profile - cumulate time for patAveTable 
     387             :        //double usr = 0.;
     388             :        //double rea = 0.;
     389             :        //double sys = 0.;
     390             :        //Timer tmr2;
     391             :        //
     392             : 
     393             :        //timer for the total averaging time
     394           0 :        Timer tmr3;
     395           0 :        vi.origin();
     396           0 :        for (vi.originChunks(); vi.moreChunks(); vi.nextChunk()) {
     397             : #if LOG2
     398             :          cout << ">>>>>>>>>chunk=" << iChunk << endl;
     399             : #endif
     400             : 
     401           0 :          for (vi.origin(); vi.more(); vi++) {
     402           0 :             if (nAvePol == -1)
     403           0 :                nAvePol = vi.nCorr();
     404             : 
     405           0 :             if (nAvePol != vi.nCorr())
     406           0 :                cout << "nAvePol=" << nAvePol << endl;
     407             : 
     408           0 :             vi.time(curTime);
     409             :             //vi.antenna1(ant1);
     410             :             //vi.antenna2(ant2);
     411             : 
     412           0 :             Int nRow = curTime.nelements();
     413             :             //Int nRow = vi.nRow();
     414             :             //Int nRow = vb.nRow();
     415             : 
     416             : #if LOG2 
     417             :             cout << ">>>>>>iIter=" << iIter << " nRow=" << nRow << endl;
     418             :             cout << std::setprecision(12);
     419             : #endif
     420             : 
     421           0 :             Cube<Complex>& vc = vb.visCube();
     422           0 :             if (!upcase(column).compare("CORRECTEDDATA") ||
     423           0 :                 !upcase(column).compare("CORRECTED_DATA")) {
     424           0 :                vc = vb.correctedVisCube();
     425             :             }
     426           0 :             if (!upcase(column).compare("MODELDATA") ||
     427           0 :                 !upcase(column).compare("MODEL_DATA")) {
     428           0 :                vc = vb.modelVisCube(); 
     429             :             }
     430           0 :             if (!upcase(column).compare("RESIDUAL") ||
     431           0 :                 !upcase(column).compare("CORRECTEDMODEL_DATA")) {
     432           0 :                vc = vb.correctedVisCube() - vb.modelVisCube();
     433             :             }
     434             :             Int i1, i2, i3;
     435           0 :             vc.shape(i1, i2, i3);
     436             :             //cout << "i1=" << i1 << " i2=" << i2 << " i3=" << i3 << endl;
     437           0 :             Cube<Complex> aveV(i1, nAveChan, 1); 
     438           0 :             Cube<Bool> aveF(i1, nAveChan, 1); 
     439             :             
     440           0 :             Int field = vb.fieldId();
     441           0 :             Int arry = vb.arrayId();
     442             : 
     443           0 :             Vector<rownr_t> rowNumber = vb.rowIds();
     444             :             //cout << "rowIds=" << rowNumber << endl;
     445           0 :             for (int row = 0; row < nRow; row++) {
     446             :                //skip flagged rows when selecting good data
     447             :                //this is done to make sure for good data average
     448             :                //each timebin start with good data
     449           0 :                while(row < nRow && vb.flagRow()(row) && aveFlag == 0) { 
     450           0 :                   row++;
     451             :                };
     452           0 :                if (row == nRow) 
     453           0 :                   break;
     454             : 
     455             :                //skip rows that are not in the selected spw
     456           0 :                Int dId = vi.dataDescriptionId();
     457           0 :                Int spwSelected = SAS::spwByDesc(dId, spw);
     458           0 :                while (row < nRow && spwSelected == -1) {
     459           0 :                      row++;
     460             :                } 
     461             :                //cout << "row=" << row 
     462             :                //     << " spwSelected=" << spwSelected << endl;
     463           0 :                if (row == nRow) 
     464           0 :                   break;
     465             : 
     466             :                //should not be, but careful
     467           0 :                if (spwSelected == -1)
     468           0 :                   spwSelected = 0;
     469             : 
     470             :                //cout << "row=" << row << " nRow=" << vb.nRow()
     471             :                //     << " dId=" << dId << endl;  
     472             : 
     473             :                //Double thisTime = curTime(row);
     474           0 :                Double thisTime = vb.time()(row);
     475           0 :                newTime = (thisTime - bufTime > aveTime - 0.005);
     476             :                //cout << "thisTime=" << std::setprecision(20) << thisTime 
     477             :                //     << " bufTime=" << bufTime << endl;
     478             : 
     479             : 
     480           0 :                newField = field - bufField;
     481           0 :                newArray = arry - bufArray;
     482             : 
     483           0 :                Int scan = vb.scan()(row);
     484           0 :                newScan = (scan - bufScan);
     485             : 
     486           0 :                newDesc = (dId - bufDesc); 
     487             : 
     488             :                //if (newDesc)
     489             :                //   cout << "newDesc=" << dId << endl;
     490             : 
     491           0 :                if (newField || (!crossScans && newScan) || 
     492           0 :                    newTime || (!crossArrays && newArray) || 
     493           0 :                               (!crossSpws && newDesc)) {
     494             : 
     495           0 :                      if (nTotalTime > 0)
     496           0 :                          sumTime /= nTotalTime;
     497             :                      //cout << "-nTotalTime=" << nTotalTime 
     498             :                      //     << " sumTime=" << sumTime << endl;
     499             : 
     500             :                      //tmr2.mark();
     501           0 :                      if (outputMode == MsAverager::TableMS)
     502           0 :                         putAveTable(bufTime, bufField, bufScan, bufArray, 
     503           0 :                                     bufDesc, *pAveBuff, nTime, sumTime);
     504             :                      else
     505           0 :                         putAveBuffer(bufTime, bufField, bufScan, bufArray,
     506           0 :                                      *pAveBuff, nTime); 
     507             :                      //usr += tmr2.user();
     508             :                      //rea += tmr2.real();
     509             :                      //sys += tmr2.system();
     510             :    
     511           0 :                      if (pAveBuff) {
     512           0 :                         delete pAveBuff;
     513           0 :                         pAveBuff = 0;
     514             :                      }
     515             :    
     516           0 :                      bufTime = thisTime;
     517           0 :                      bufField = field;
     518           0 :                      bufScan = scan;
     519           0 :                      bufArray = arry;
     520           0 :                      bufDesc = dId;
     521             :                      
     522           0 :                      pAveBuff = new VisBuffer;
     523           0 :                      initAveBuffer(bufTime, *pAveBuff, nAnt, nAveChan);
     524           0 :                      nAveTime++;
     525           0 :                      nTime = 0;
     526           0 :                      sumTime = 0;
     527           0 :                      nTotalTime = 0;
     528             :                }
     529             : 
     530           0 :                if (nextTime != thisTime) {
     531           0 :                   sumTime += (thisTime - bufTime);
     532           0 :                   nTotalTime++;
     533             :                }
     534             : 
     535             :                //cout << "row=" << row << " thisTime=" 
     536             :                //     << std::setprecision(12) << thisTime
     537             :                //     << " bufTime=" << bufTime 
     538             :                //     << " sumTime=" << sumTime 
     539             :                //     << " nTime=" << nTime << endl;
     540             :                
     541           0 :                Int ant1 = vb.antenna1()(row);
     542           0 :                Int ant2 = vb.antenna2()(row);
     543             : 
     544           0 :                Int orow = baselineRow(ant1, ant2);
     545           0 :                if (orow < 0)
     546           0 :                   continue;
     547             : 
     548             :                //Int orow = baselineRow(nAnt, ant1, ant2);
     549             :                //cout << "row=" << row << " orow=" << orow 
     550             :                //     << " nAnt=" << nAnt   
     551             :                //     << " ant1=" << ant1 << " ant2=" << ant2 << endl;
     552             :                //aveBuff.antenna1()(orow) = ant1;
     553             :                //aveBuff.antenna2()(orow) = ant2;
     554             : 
     555           0 :                pAveBuff->time()(orow) = bufTime;
     556           0 :                pAveBuff->feed1()(orow) = vb.feed1()(row);
     557             :                //pAveBuff->feed2()(orow) = vb.feed2()(row);
     558             : 
     559           0 :                Complex xxx = 0.;
     560             :                
     561             :                //cout << "flagrow=" << vb.flagRow()(row) << endl; 
     562             :                //showVisRow(vc, row);
     563             :                //cout << vb.flagCube();
     564             : 
     565           0 :                Int sw = SAS::spwIndexByDesc(dId, spw);
     566           0 :                if (sw < 0) sw = 0;
     567           0 :                pAveBuff->sigma()(orow) = spw(sw).rFreq;
     568             : 
     569           0 :                if (aveFlag) {
     570             :                   //select flagged
     571             : 
     572             :                   //init every cell unflagged
     573           0 :                   for (Int pol = 0; pol < nAvePol; pol++) {
     574           0 :                      for (Int chn = 0; chn < nAveChan; chn++) {
     575           0 :                         aveV(pol, chn, 0) = 0.;
     576           0 :                         aveF(pol, chn, 0) = 0;               
     577             :                      }
     578             :                   }
     579             : 
     580           0 :                   if (vb.flagRow()(row)) {
     581             :                      //row flagged = everyone is flagged, should select
     582             :                      //cout << "flagged row" << endl;
     583             :                    
     584           0 :                      for (Int pol = 0; pol < nAvePol; pol++) {
     585             : 
     586           0 :                         xxx = 0.;
     587           0 :                         Int p = 0;
     588           0 :                         Int chn = 0;
     589             :                            
     590           0 :                         Int sChan = 0; 
     591           0 :                         for (chn = 0; chn < Int(spw(sw).chans.size()); chn++) {
     592             : 
     593           0 :                            Int chNum = spw(sw).chans(chn);
     594           0 :                            p++;
     595           0 :                            if (aveMode == "SCALAR") {
     596           0 :                               xxx += Complex(fabs(vc(pol, chNum, row)),0.0);
     597             :                            }
     598             :                            else {
     599           0 :                               xxx += vc(pol, chNum, row);
     600             :                            }
     601           0 :                            if (p == aveChan) {
     602           0 :                               aveV(pol, sChan, 0) = xxx / p;
     603           0 :                               aveF(pol, sChan, 0) = 1;
     604           0 :                               xxx = 0;
     605           0 :                               p = 0;
     606           0 :                               sChan++;   
     607             :                            }
     608             :                         }
     609           0 :                         if (p > 0) {
     610           0 :                            aveV(pol, sChan, 0) = xxx / p;
     611           0 :                            aveF(pol, sChan, 0) = 1;
     612             :                         }
     613           0 :                         sChan++;
     614             :                      }
     615             :                   }
     616             :                   else {
     617             :                      //only select flagged ; 
     618             :                      //cout << " not row flagged" << endl;
     619           0 :                      for (Int pol = 0; pol < nAvePol; pol++) {
     620             : 
     621           0 :                         xxx = 0.;
     622           0 :                         Int p = 0;
     623           0 :                         Int sx = 0; 
     624           0 :                         Int chn = 0;
     625             : 
     626           0 :                         Int sChan = 0;
     627           0 :                         for (chn = 0; chn < Int(spw(sw).chans.size()); chn++) {
     628             :    
     629           0 :                            Int chNum = spw(sw).chans(chn);
     630           0 :                            p++;
     631           0 :                            if (vb.flagCube()(pol, chNum, row)) {
     632           0 :                               if (aveMode == "SCALAR") {
     633           0 :                                  xxx += Complex(fabs(vc(pol, chNum, row)),0.0);
     634             :                               }
     635             :                               else {
     636           0 :                                  xxx += vc(pol, chNum, row);
     637             :                               }
     638           0 :                               sx++;
     639             :                            }
     640           0 :                            if (p == aveChan) {
     641           0 :                               if (sx > 0) {
     642           0 :                                  aveV(pol, sChan, 0) = xxx / sx;
     643           0 :                                  aveF(pol, sChan, 0) = 1;
     644             :                               }
     645           0 :                               xxx = 0;
     646           0 :                               p = 0;
     647           0 :                               sx = 0;
     648           0 :                               sChan++;   
     649             :                            }
     650             :                         }
     651           0 :                         if (p > 0) {
     652           0 :                            if (sx > 0) {
     653           0 :                               aveV(pol, sChan, 0) = xxx / sx;
     654           0 :                               aveF(pol, sChan, 0) = 1;
     655             :                            }
     656           0 :                            sChan++;
     657             :                         }
     658             :                      }
     659             :                   }
     660             :                   //showVisRow(aveV, row);
     661             :                   //cout << aveF.xyPlane(0) << endl;
     662             :                }
     663             :                else {
     664             :                   //select non-flagged=good data
     665             :                   // cout << "row=" << rowNumber(row) 
     666             :                   //      << " flagrow=" << vb.flagRow()(row)
     667             :                   //      << " " << vb.flagCube();
     668             : 
     669             :                   //init every cell flagged
     670           0 :                   for (Int pol = 0; pol < nAvePol; pol++) {
     671           0 :                      for (Int chn = 0; chn < nAveChan; chn++) {
     672           0 :                         aveV(pol, chn, 0) = 0.;
     673           0 :                         aveF(pol, chn, 0) = 1;               
     674             :                      }
     675             :                   }
     676             : 
     677           0 :                   if (!vb.flagRow()(row)) {
     678             :                      //only select non-flagged
     679           0 :                      for (Int pol = 0; pol < nAvePol; pol++) {
     680             : 
     681           0 :                         xxx = 0.;
     682           0 :                         Int p = 0;
     683           0 :                         Int sx = 0; 
     684             : 
     685           0 :                         Int sChan = 0;
     686             :                         Int chn;
     687           0 :                         for (chn = 0; chn < Int(spw(sw).chans.size()); chn++){
     688             :    
     689           0 :                            Int chNum = spw(sw).chans(chn);
     690           0 :                            p++;
     691           0 :                            if (!(vb.flagCube()(pol, chNum, row))) {
     692           0 :                               if (aveMode == "SCALAR") {
     693           0 :                                  xxx += Complex(fabs(vc(pol, chNum, row)),0.0);
     694             :                               }
     695             :                               else {
     696           0 :                                  xxx += vc(pol, chNum, row);
     697             :                               }
     698           0 :                               sx++;
     699             :                            }
     700           0 :                            if (p == aveChan) {
     701           0 :                               if (sx > 0) {
     702           0 :                                  aveV(pol, sChan, 0) = xxx / sx;
     703           0 :                                  aveF(pol, sChan, 0) = 0;
     704             :                               }
     705           0 :                               xxx = 0;
     706           0 :                               p = 0;
     707           0 :                               sx = 0;
     708           0 :                               sChan++;   
     709             :                            }
     710             :                         }
     711           0 :                         if (p > 0) {
     712           0 :                            if (sx > 0) {
     713           0 :                               aveV(pol, sChan, 0) = xxx / sx;
     714           0 :                               aveF(pol, sChan, 0) = 0;
     715             :                            }
     716           0 :                            sChan++;
     717             :                         }
     718             :                      }
     719             :                   }
     720             :                }
     721             : 
     722             :                //cout << "orow=" << orow << endl;
     723             :                //weight is on polarization, should be a vector, but
     724             :                //defined in visBuffer as a scalar, good enugh for averaging
     725           0 :                Float wt = vb.weight()(row);
     726             :        
     727           0 :                pAveBuff->timeInterval()(orow) += 
     728           0 :                                             vb.timeInterval()(row) * wt;
     729           0 :                RigidVector<Double, 3> wtuvw = vb.uvw()(row) * Double(wt);
     730           0 :                pAveBuff->uvw()(orow) += wtuvw;
     731           0 :                pAveBuff->weight()(orow) += wt;
     732             : 
     733           0 :                for (Int pol = 0; pol < nAvePol; pol++) {
     734           0 :                   for (Int chn = 0; chn < nAveChan; chn++) {
     735             :                      //cout << "pol=" << pol << " chn=" << chn 
     736             :                      //     << " wt=" << wt
     737             :                      //     << " cellFlag=" << aveF(pol, chn, 0) 
     738             :                      //     << " aveFlag=" << aveFlag
     739             :                      //     << " Buff=" 
     740             :                      //     << pAveBuff->visCube()(pol, chn, orow);
     741           0 :                      if (aveF(pol, chn, 0) == aveFlag) {
     742           0 :                         pAveBuff->flagCube()(pol, chn, orow) = aveFlag;
     743             :                         // DComplex wtvis = 
     744             :                         //                   aveV(pol, chn, 0) * Double(wt);
     745             :                         //cout << " aveV=" << wt * aveV(pol, chn, 0) ;
     746           0 :                         pAveBuff->visCube()(pol, chn, orow) += 
     747           0 :                                           wt * aveV(pol, chn, 0);
     748           0 :                         pAveBuff->weightCube()(pol, chn, orow) += wt;
     749             :                      }
     750             :                      //cout << " ==>" 
     751             :                      //      << pAveBuff->visCube()(pol, chn, orow);
     752             :                 
     753             :                   }
     754             :                }
     755             :                //showVisRow(pAveBuff->visCube(), orow);
     756             :                //showVisRow(aveV, 0);
     757             :                //cout << pAveBuff->flagCube().xyPlane(orow); 
     758             : 
     759           0 :                if (crossBlines) 
     760           0 :                   aveRowMap(iRow, 0) = msRow;
     761             :                else
     762           0 :                   aveRowMap(iRow, 0) = msRow + orow;
     763           0 :                aveRowMap(iRow, 1) = rowNumber(row);
     764           0 :                aveRowMap(iRow, 2) = spwSelected;
     765             :                
     766             :                //cout << "row=" << row << " "
     767             :                //     << aveRowMap(iRow, 0) << " " 
     768             :                //     << aveRowMap(iRow, 1) << " " 
     769             :                //     << aveRowMap(iRow, 2) << endl;
     770             : 
     771           0 :                iRow++;
     772             :                //cout << "iRow=" << iRow << endl;
     773             :             }
     774           0 :             nTime++;
     775             :             //showVisRow(vc, 0);
     776           0 :             iIter++;  
     777             :             //cout << "nTime=" << nTime << " iIter=" << iIter << endl; 
     778           0 :          }
     779           0 :          iChunk++;  
     780             :       }
     781           0 :       tmr3.show("  Averaging:");
     782             : 
     783           0 :       if (nTotalTime > 0)
     784           0 :          sumTime /= nTotalTime;
     785             :       //cout << "nTotalTime=" << nTotalTime 
     786             :       //    << " sumTime=" << sumTime << endl;
     787             : 
     788             :       //tmr2.mark();
     789           0 :       if (outputMode == MsAverager::TableMS)
     790           0 :          putAveTable(bufTime, bufField, bufScan, bufArray, bufDesc, 
     791           0 :                      *pAveBuff, nTime, sumTime);
     792             :       else
     793           0 :          putAveBuffer(bufTime, bufField, bufScan, bufArray,
     794           0 :                      *pAveBuff, nTime);
     795             :       //usr += tmr2.user();
     796             :       //rea += tmr2.real();
     797             :       //sys += tmr2.system();
     798             : 
     799           0 :       if (pAveBuff) {
     800           0 :          delete pAveBuff;
     801           0 :          pAveBuff = 0;
     802             :       }
     803             :       //showAveMap(aveRowMap, aveChanMap); 
     804             : 
     805             :       {
     806           0 :          ostringstream os;
     807             :          os << "TOTAL " 
     808           0 :             << "Chunks=" << iChunk << " Iters=" << iIter 
     809           0 :             << " Rows=" << iRow << " nAveTime=" << nAveTime 
     810           0 :             << " nAveChan=" << nAveChan << " nAveRow=" << nAveRow 
     811           0 :             << " nAvePol=" << nAvePol
     812           0 :             << endl;
     813             :          //SLog::slog()->out(os, fnname, clname, LogMessage::NORMAL5);
     814           0 :       }
     815             : 
     816             :       //cout << "iRow=" << iRow << endl;
     817             :       //cout << "pMS->nrow()=" << pMS->nrow() << endl;
     818           0 :       aveRowMap.resize(iRow, 3, true);
     819             :       //showAveMap(aveRowMap, aveChanMap); 
     820             : 
     821             :       {
     822           0 :          ostringstream os;
     823           0 :          os << aveRowMap;
     824             :          //SLog::slog()->out(os, fnname, clname, LogMessage::DEBUG1);
     825           0 :       }
     826             : 
     827             :       //cout << "putAveTable:" << setw(11) << rea << " real "
     828             :       //   << setw(11) << usr << " user "
     829             :       //   << setw(11) << sys << " system" << endl;
     830             : 
     831           0 :    } 
     832           0 :    catch (const AipsError &x) {
     833             :       //SLog::slog()->out(String("Error: ") + x.getMesg(),
     834             :              //fnname, clname, LogMessage::WARN);
     835           0 :       LogIO os(LogOrigin("MsAverager", "setAverager"));
     836             :       os << LogIO::WARN << "Error: "
     837             :                    << x.getMesg()
     838           0 :                    << LogIO::POST;
     839           0 :       aveOK = false;
     840           0 :       return ;
     841           0 :    }
     842             :    //catch (...) {cout << "problem------" << endl;}
     843           0 :    aveOK = true;
     844           0 :    return;
     845           0 : }
     846             : 
     847           0 : void MsAverager::putAveTable(Double bufTime, Int bufField, Int bufScan,
     848             :                              Int bufArray, Int bufDesc, VisBuffer& aveBuff, 
     849             :                              Int nTime, Double timeShift) {
     850           0 :    if (nTime < 1)
     851           0 :       return;
     852             : 
     853           0 :    if (bufTime == -1 && bufField == -1 && bufScan == -1 && bufArray == -1)
     854           0 :       return;
     855             : 
     856             : 
     857             : #if LOG2
     858             :    cout << " putAveTable: bufTime=" << bufTime
     859             :         << " bufField=" << bufField
     860             :         << " bufScan=" << bufScan
     861             :         << " bufArray=" << bufArray
     862             :         << " bufDesc=" << bufDesc
     863             :         << " nRow=" << aveBuff.nRow()
     864             :         << " nTime=" << nTime
     865             :         << " nChannel=" << aveBuff.nChannel() 
     866             :         << endl;
     867             : #endif
     868           0 :    if (nAveRow < 1)
     869           0 :       nAveRow = aveBuff.nRow();
     870             :    //cout << "nAveRow=" << nAveRow << endl;
     871             :    //ScalarColumn<Double> timeCol(aMS, "TIME");
     872             :    
     873             :    //sigma stores refFreq, verify it containing only one nozero value
     874           0 :    Float sigVal = 0;
     875           0 :    Int sigValChange = 0;
     876           0 :    for (Int row = 0; row < nAveRow; row++) {
     877           0 :       Float sig = aveBuff.sigma()(row);  
     878           0 :       if (sig && sig != sigVal) {
     879           0 :          sigVal = sig;
     880           0 :          sigValChange++;
     881             :       }
     882             :       //cout << "sigma=" << aveBuff.sigma()(row) 
     883             :       //     << " row=" << row << endl;
     884             :    }
     885             :    //cout << "sigValChange=" << sigValChange << endl;
     886             :    //
     887           0 :    Vector<Float> refVal(1);
     888           0 :    refVal= sigVal;
     889             : 
     890             : 
     891           0 :    Vector<Complex> frqvel(nAveChan);
     892           0 :    Vector<Complex> sxsave(nAveChan);
     893           0 :    sxsave = 0;
     894           0 :    frqvel = 0;
     895             : 
     896           0 :    Int idx = SAS::spwIndexByDesc(bufDesc, spw);
     897           0 :    if (idx < 0) return;
     898             : 
     899             :    //calculate averaged velocities, store into velo 
     900           0 :    Vector<Double> velo(nAveChan);
     901             :    
     902           0 :    if (aveVel)
     903           0 :    SAS::averageVelocity(sorryVel, pMS, spw, velo, idx, bufField,
     904           0 :                         restfreq, frame, doppler);
     905             :    //cout << "velo=" << velo << " freq=" << spw(idx).aveFreqs << endl;
     906             : 
     907           0 :    for (uInt j = 0; j < spw(idx).aveFreqs.size(); j++) {
     908           0 :       frqvel(j) = Complex(velo(j), spw(idx).aveFreqs(j));
     909           0 :       sxsave(j) = Complex(spw(idx).aveChans(j), spw(idx).sxsChans(j));
     910             :    }
     911             : 
     912             : 
     913           0 :    if (crossBlines) { 
     914             :       //cout << " crossBlines=true" << endl; 
     915           0 :       aMS.addRow();
     916             : 
     917           0 :       Int tRow = msRow;
     918           0 :       msc->time().put(tRow, bufTime);
     919           0 :       msc->antenna1().put(tRow, aveBuff.antenna1()(0)); 
     920           0 :       msc->antenna2().put(tRow, aveBuff.antenna2()(0)); 
     921             : 
     922           0 :       msc->fieldId().put(tRow, bufField); 
     923           0 :       msc->scanNumber().put(tRow, bufScan); 
     924           0 :       msc->arrayId().put(tRow, bufArray);
     925           0 :       msc->feed1().put(tRow, aveBuff.feed1()(0)); 
     926           0 :       msc->dataDescId().put(tRow, bufDesc);
     927             :       //msc->feed2().put(tRow, aveBuff.feed2()(0)); 
     928           0 :       msc->sigma().put(tRow, refVal); 
     929             : 
     930             : 
     931           0 :       Vector<Float> w(nAvePol < 1 ? 1 : nAvePol);
     932           0 :       for (Int row = 0; row < nAveRow; row++) {
     933           0 :          for (Int pol = 0; pol < nAvePol; pol++) {
     934           0 :             for (Int chn = 0; chn < nAveChan; chn++) {
     935           0 :                Float wc  = aveBuff.weightCube()(pol, chn, row);
     936           0 :                if (wc > 0.) {
     937           0 :                   aveBuff.visCube()(pol, chn, row) /= wc;
     938             :                } 
     939             :                else {
     940           0 :                   aveBuff.visCube()(pol, chn, row) = 0.;
     941             :                }
     942             :             }
     943             :          }
     944             : 
     945           0 :          Float wt = aveBuff.weight()(row);
     946           0 :          if (wt == 0.0f) { 
     947           0 :             w = wt;
     948           0 :             wt = 1;
     949             :          }
     950             :          else {
     951           0 :             w = wt / nTime;
     952             :          }
     953           0 :          aveBuff.weight()(row) = wt;
     954           0 :          aveBuff.uvw()(row) = aveBuff.uvw()(row) * Double(1. / wt);
     955           0 :          aveBuff.timeInterval()(row) /= wt;
     956             :       }
     957             : 
     958           0 :       Cube<Complex> blV(nAvePol, nAveChan, 1);
     959           0 :       Cube<Complex> blU(nAvePol, nAveChan, 1);
     960           0 :       Cube<Bool> blF(nAvePol, nAveChan, 1);
     961           0 :       for (Int pol = 0; pol < nAvePol; pol++) {
     962           0 :          for (Int chn = 0; chn < nAveChan; chn++) {
     963           0 :             blV(pol, chn, 0) = 0.;
     964           0 :             blF(pol, chn, 0) = !aveFlag;
     965             :          }
     966             :       }
     967             : 
     968           0 :       for (Int pol = 0; pol < nAvePol; pol++) {
     969           0 :          for (Int chn = 0; chn < nAveChan; chn++) {
     970           0 :             Int blW = 0;
     971           0 :             for (Int row = 0; row < nAveRow; row++) {
     972           0 :                if (aveBuff.flagCube()(pol, chn, row) == aveFlag) {
     973           0 :                   blV(pol, chn, 0) += 
     974           0 :                      aveBuff.visCube()(pol, chn, row);
     975           0 :                   blW++;
     976             :                } 
     977             :             }
     978           0 :             if (blW > 0) {
     979           0 :                blV(pol, chn, 0) /= blW;
     980           0 :                blF(pol, chn, 0) = aveFlag;
     981             :             }
     982             :          }
     983             :       }
     984             :    
     985           0 :       Int nFlags = 0;
     986           0 :       for (Int pol = 0; pol < nAvePol; pol++) {
     987           0 :          for (Int chn = 0; chn < nAveChan; chn++) {
     988           0 :             if (!blF(pol, chn, 0)) {
     989           0 :                nFlags++;
     990             :             }
     991             :          }
     992             :       }
     993           0 :       if (nFlags)
     994           0 :          msc->flagRow().put(tRow, 0);
     995             :       else 
     996           0 :          msc->flagRow().put(tRow, 1);
     997             :          
     998           0 :       msc->data().put(tRow, blV.xyPlane(0));
     999           0 :       msc->flag().put(tRow, blF.xyPlane(0));  
    1000           0 :       RigidVector<Double, 3> bluvw = aveBuff.uvw()(0) * Double(1.);
    1001           0 :       msc->uvw().put(tRow, bluvw.vector());
    1002             :    
    1003             :       //showVisRow(blV, 0);
    1004             :       //showMsRow(msc, tRow);
    1005             :    
    1006           0 :       msc->weight().put(tRow, w);
    1007             : 
    1008           0 :       for (Int pol = 0; pol < nAvePol; pol++) {
    1009           0 :          for (Int chn = 0; chn < nAveChan; chn++) {
    1010           0 :             blV(pol, chn, 0) = frqvel(chn);
    1011           0 :             blU(pol, chn, 0) = sxsave(chn);
    1012             :          }
    1013             :       }
    1014             :       //msc->modelData().put(tRow, blV.xyPlane(0));
    1015             :       //msc->correctedData().put(tRow, blU.xyPlane(0));
    1016             :    
    1017           0 :       if (timeShift > 0.) {
    1018             :          //cout << " bufTime=" << std::setprecision(12) 
    1019             :          //     << bufTime << " timeShift=" << timeShift << endl;
    1020           0 :          msc->time().put(tRow, bufTime + timeShift);
    1021             :       }
    1022             :       else {
    1023           0 :          msc->time().put(tRow, 
    1024           0 :             bufTime + 0.5 * aveBuff.timeInterval()(0) * (nTime - 1));
    1025             :       }
    1026           0 :    }
    1027             :    else {
    1028             :    
    1029             :       //cout << " crossBlines=false" << endl; 
    1030             :    
    1031           0 :       for (Int row = 0; row < nAveRow; row++) {
    1032           0 :          for (Int pol = 0; pol < nAvePol; pol++) {
    1033           0 :             for (Int chn = 0; chn < nAveChan; chn++) {
    1034           0 :                aveBuff.modelVisCube()(pol, chn, row) = frqvel(chn);
    1035           0 :                aveBuff.correctedVisCube()(pol, chn, row) = sxsave(chn);
    1036             :             }
    1037             :          }
    1038             :       }
    1039             :    
    1040           0 :       for (Int row = 0; row < nAveRow; row++) {
    1041             :          
    1042           0 :          Int nFlags = 0;
    1043             :          //Int tFlags = nAvePol * nAveChan;
    1044           0 :          for (Int pol = 0; pol < nAvePol; pol++) {
    1045           0 :             for (Int chn = 0; chn < nAveChan; chn++) {
    1046           0 :                Float wc  = aveBuff.weightCube()(pol, chn, row);
    1047             :                //flags should be correct, no need to fiddle
    1048           0 :                if (wc > 0.) {
    1049           0 :                   aveBuff.visCube()(pol, chn, row) /= wc;
    1050             :                } 
    1051             :                else {
    1052           0 :                   aveBuff.visCube()(pol, chn, row) = 0.;
    1053             :                }
    1054           0 :                if (!aveBuff.flagCube()(pol, chn, row))
    1055           0 :                   nFlags++;
    1056             :                //if (wc > 0)
    1057             :                //   cout << " wc=" << wc << " row=" << row << " >>>" 
    1058             :                //   << aveBuff.visCube()(pol, chn, row);
    1059             :             }
    1060             :          }
    1061             : 
    1062           0 :          Int tRow = msRow + row;
    1063           0 :          aMS.addRow();
    1064             :          
    1065           0 :          msc->time().put(tRow, bufTime);
    1066           0 :          msc->antenna1().put(tRow, aveBuff.antenna1()(row)); 
    1067           0 :          msc->antenna2().put(tRow, aveBuff.antenna2()(row)); 
    1068             :          //cout << "sigma=" << aveBuff.sigma()(row) << " row=" << row << endl;
    1069           0 :          msc->sigma().put(tRow, refVal); 
    1070             :      
    1071             :    
    1072           0 :          if (nFlags)
    1073           0 :             msc->flagRow().put(tRow, 0);
    1074             :          else 
    1075           0 :             msc->flagRow().put(tRow, 1);
    1076             :          
    1077             :          
    1078           0 :          Vector<Float> w(nAvePol < 1 ? 1 : nAvePol);
    1079           0 :          Float wt = aveBuff.weight()(row);
    1080           0 :          if (wt == 0.0f) { 
    1081           0 :             w = wt;
    1082           0 :             wt = 1;
    1083             :          }
    1084             :          else {
    1085           0 :             w = wt / nTime;
    1086             :          }
    1087             :          
    1088           0 :          msc->flag().put(tRow, aveBuff.flagCube().xyPlane(row));  
    1089           0 :          msc->weight().put(tRow, w);
    1090           0 :          msc->uvw().put(tRow, (aveBuff.uvw()(row) * Double(1. / wt)).vector());
    1091             : 
    1092             :          //msc->data().put(tRow, aveBuff.visCube().xyPlane(row) / wt);
    1093           0 :          msc->data().put(tRow, aveBuff.visCube().xyPlane(row));
    1094           0 :          msc->fieldId().put(tRow, bufField); 
    1095           0 :          msc->scanNumber().put(tRow, bufScan); 
    1096           0 :          msc->arrayId().put(tRow, bufArray);
    1097           0 :          msc->feed1().put(tRow, aveBuff.feed1()(row)); 
    1098           0 :          msc->dataDescId().put(tRow, bufDesc);
    1099             :          //msc->feed2().put(tRow, aveBuff.feed2()(row)); 
    1100             :          //msc->modelData().put(tRow, aveBuff.visCube().xyPlane(row));
    1101             :    
    1102           0 :          if (timeShift > 0.) {
    1103             :             //cout << " bufTime=" << std::setprecision(12) 
    1104             :             //     << bufTime << " timeShift=" << timeShift << endl;
    1105           0 :             msc->time().put(tRow, bufTime + timeShift);
    1106             :          }
    1107             :          else {
    1108           0 :             Float itvl = aveBuff.timeInterval()(row) / wt;
    1109           0 :             msc->interval().put(tRow, itvl);
    1110             :             //cout << "interval=" << itvl << endl;
    1111           0 :             msc->time().put(tRow, bufTime + 0.5 * itvl * (nTime - 1));
    1112             :          }
    1113             :    
    1114             :          //showVisRow(aveBuff.visCube(), row);
    1115             :          //showMsRow(msc, tRow);
    1116             :    
    1117             :          // the flag and vis for the resulting row  
    1118             :          //   cout << "row=" << row 
    1119             :          //        << " flagCube=" << aveBuff.flagCube().xyPlane(row) 
    1120             :          //        << " visCube=" << aveBuff.visCube().xyPlane(row)
    1121             :          //        << endl; 
    1122             :          //msc->modelData().put(tRow, aveBuff.modelVisCube().xyPlane(row));
    1123             :          //msc->correctedData().put(tRow, aveBuff.correctedVisCube().xyPlane(row));
    1124           0 :       }
    1125             :       
    1126             :    }
    1127             : 
    1128             :    //MSSpWindowColumns spwColumn(aMS.spectralWindow());
    1129             :    //ScalarColumn<Int> numCol = spwColumn.numChan();
    1130             :    //spwColumn.numChan().put(idx, nAveChan); 
    1131             : 
    1132           0 :    msRow = aMS.nrow();
    1133             :    //cout << "msRow=" << msRow << endl;
    1134             :    
    1135           0 :    return;
    1136           0 : }
    1137             : 
    1138           0 : void MsAverager::putAveBuffer(Double IfLog2 (bufTime), Int IfLog2 (bufField), Int IfLog2 (bufScan),
    1139             :                               Int IfLog2 (bufArray), VisBuffer& aveBuff, Int nTime) {
    1140             : #if LOG2
    1141             :    cout << " putAveBuffer: bufTime=" << bufTime
    1142             :         << " bufField=" << bufField
    1143             :         << " bufScan=" << bufScan
    1144             :         << " bufArray=" << bufArray
    1145             :         << " nRow=" << aveBuff.nRow()
    1146             :         << " nTime=" << nTime
    1147             :         << " nChannel=" << aveBuff.nChannel() 
    1148             :         << endl;
    1149             : #endif
    1150             : 
    1151           0 :    if (nTime < 1)
    1152           0 :       return;
    1153             : 
    1154           0 :    if (nAveRow < 1)
    1155           0 :       nAveRow = aveBuff.nRow();
    1156             : 
    1157           0 :    for (Int row = 0; row < nAveRow; row++) {
    1158             : 
    1159             :       //aveBuff.time()(row) = bufTime;
    1160             : 
    1161           0 :       Float wt = aveBuff.weight()(row);
    1162           0 :       if (wt == 0.0f) { 
    1163           0 :          wt = 1.;
    1164             :       }
    1165             : 
    1166           0 :       aveBuff.timeInterval()(row) /= wt;
    1167           0 :       aveBuff.uvw()(row) *= 1.0f / wt;
    1168           0 :       for (Int pol = 0; pol < nAvePol; pol++) {
    1169           0 :          for (Int chn = 0; chn < nAveChan; chn++) {
    1170           0 :             aveBuff.visCube()(pol, chn, row) *= 1.0f / wt;
    1171             :          }
    1172             :       }
    1173             :    }
    1174             : 
    1175             : 
    1176           0 :    aveList.push_back(pAveBuff); 
    1177             : 
    1178           0 :    return;
    1179             : }
    1180             : 
    1181           0 : Int MsAverager::baselineRow(const Int& nAnt, const Int& a1, const Int& a2)
    1182             : {
    1183             :   Int index;
    1184           0 :   index = nAnt * a1 - (a1 * (a1 - 1)) / 2 + a2 - a1;
    1185           0 :   if (a1 > a2)
    1186           0 :      index = nAnt * a2 - (a2 * (a2 - 1)) / 2 + a1 - a2;
    1187           0 :   return index;
    1188             : }
    1189             : 
    1190           0 : Int MsAverager::baselineRow(const Int& a1, const Int& a2)
    1191             : {
    1192             :   //cout << "bls=" << bls << " bls.shape=" << bls.shape()
    1193             :   //     << " a1=" << a1 << " a2=" << a2 << endl;
    1194           0 :   if (a1 < 0 && a2 < 0)
    1195           0 :      return baselines.shape()[0];
    1196           0 :   Int index = -1;
    1197           0 :   for (Int i = 0; i < baselines.shape()[0]; i++) { 
    1198           0 :      if (a1 == baselines(i, 0) && a2 == baselines(i, 1))
    1199           0 :        index = i;
    1200             :   }
    1201           0 :   return index;
    1202             : }
    1203             : 
    1204           0 : void MsAverager::showMsRow(MSMainColumns* msc, Int row) {
    1205           0 :    cout << "row=" << row 
    1206           0 :         << "\ntime=" << std::setprecision(12) << msc->time()(row) 
    1207           0 :         << " rowflag=" << msc->flagRow()(row) 
    1208             :         << std::setprecision(5)
    1209           0 :         << "\nant1=" << msc->antenna1()(row)
    1210           0 :         << " ant2=" << msc->antenna2()(row)
    1211           0 :         << "\ndata=" << msc->data()(row) 
    1212           0 :         << "\nflag=" << msc->flag()(row) 
    1213           0 :         << "\nsigma=" << msc->sigma()(row) 
    1214           0 :         << "\ndesc=" << msc->dataDescId()(row) 
    1215           0 :         << endl; 
    1216           0 : }
    1217             : 
    1218           0 : void MsAverager::showVisRow(Cube<Complex>& vc, Int row) {
    1219           0 :    IPosition ipos = vc.shape();
    1220           0 :    Int nPol = ipos(0);
    1221           0 :    Int nChan = ipos(1); 
    1222             :    cout << std::setprecision(8) 
    1223           0 :         << " vis (" << nPol << " pol x " << nChan << " chan):\n";
    1224           0 :    for (Int chn = 0; chn < nChan; chn++) {
    1225           0 :       for (Int pol = 0; pol < nPol; pol++) {
    1226           0 :          cout << " " << vc(pol, chn, row);
    1227             :       }
    1228           0 :       cout << endl;
    1229             :    }
    1230           0 : }
    1231             : 
    1232           0 : void MsAverager::showColumnNames() {
    1233           0 :    cout << pMS->tableDesc().columnNames() << endl; 
    1234             :    //UVW, FLAG, FLAG_CATEGORY, WEIGHT, SIGMA, ANTENNA1, ANTENNA2, 
    1235             :    //ARRAY_ID, DATA_DESC_ID, EXPOSURE, FEED1, FEED2, FIELD_ID, 
    1236             :    //FLAG_ROW, INTERVAL, OBSERVATION_ID, PROCESSOR_ID, SCAN_NUMBER, 
    1237             :    //STATE_ID, TIME, TIME_CENTROID, DATA, WEIGHT_SPECTRUM, 
    1238             :    //MODEL_DATA, CORRECTED_DATA
    1239           0 : }
    1240             : 
    1241           0 : void MsAverager::showAveMap(Matrix<Int> &/*rMap*/, Matrix<Int> &/*cMap*/) {
    1242             :    //cout << "aveRowMap=" << std::setprecision(8) << rMap;
    1243             :    //cout << "aveChanMap=" << std::setprecision(12) << cMap;
    1244           0 : }
    1245             : 
    1246           0 : Bool MsAverager::hasColumn(casacore::String const& col) {
    1247           0 :     Vector<String> cols = pMS->tableDesc().columnNames();
    1248           0 :     for (uInt i = 0; i < cols.nelements(); i++) {
    1249           0 :        if (cols(i) == col)
    1250           0 :           return true;
    1251             :     } 
    1252           0 :     LogIO os(LogOrigin("MsAverager", "hasColumn"));
    1253           0 :     os << LogIO::WARN << String("No column '") + col + "' in the MS"
    1254           0 :        << LogIO::POST;
    1255             : 
    1256           0 :     return false;
    1257           0 : }
    1258             : 
    1259           0 : Bool MsAverager::isDataColumn(casacore::String const& col) {
    1260           0 :     return col == "DATA" 
    1261           0 :         || col == "CORRECTEDDATA"
    1262           0 :         || col == "MODELDATA"
    1263             :         ;
    1264             : }
    1265             : 
    1266           0 : void MsAverager::getMap(Matrix<Int>& rowMap, Matrix<Int>& chanMap) {
    1267           0 :     rowMap.resize(0, 0);
    1268           0 :     rowMap = aveRowMap;
    1269             : 
    1270           0 :     chanMap.resize(0, 0);
    1271           0 :     chanMap = aveChanMap;
    1272           0 : } 
    1273             : 
    1274           0 : void MsAverager::getMS(MS& ms) {
    1275             :     //cout << "getMS  aMS=" << aMS << endl;
    1276           0 :     if (outputMode != MsAverager::TableMS) {
    1277             :        //SLog::slog()->out(String("MS is not available in 'ListBuffer' mode"),
    1278             :              //"getMS", clname, LogMessage::WARN);
    1279           0 :        LogIO os(LogOrigin("MsAverager", "getMS"));
    1280           0 :        os << LogIO::WARN << String("MS is not available in 'ListBuffer' mode")
    1281           0 :                    << LogIO::POST;
    1282           0 :        return;
    1283           0 :     }
    1284             :     //ms = aMS; 
    1285           0 :     ms = MS(aMS);
    1286             : } 
    1287             : 
    1288           0 : void MsAverager::getXY(Vector<Double>& x, casacore::Vector<Double>& y,
    1289             :                        Vector<Int>& f, Int pol) {
    1290             : 
    1291           0 :   if (outputMode != MsAverager::ListBuffer) {
    1292             :      //SLog::slog()->out(String("MS is not available in 'TableMS' mode"),
    1293             :              //"getXY", clname, LogMessage::WARN);
    1294           0 :      LogIO os(LogOrigin("MsAverager", "getXY"));
    1295           0 :      os << LogIO::WARN << String("MS is not available in 'TableMS' mode")
    1296           0 :                    << LogIO::POST;
    1297           0 :      return;
    1298           0 :   }
    1299             : 
    1300           0 :   VisBuffer* pAveBuff = aveList.front( );
    1301           0 :   IPosition ip = pAveBuff->visCube().shape();
    1302             : 
    1303           0 :   Int nBuff = aveList.size( ); // nAveTime
    1304           0 :   Int nRow = ip(2);
    1305             : #if LOG2
    1306             :   Int nChan = ip(1); // nAveChan
    1307             :   Int nPol = ip(0); // nAvePol
    1308             :  
    1309             :   cout << "getXY nBuff=" << nBuff << " nPol=" << nPol 
    1310             :        << " nChan=" << nChan << " nRow=" << nRow
    1311             :        << " len=" << nChan * nRow << endl;
    1312             : #endif
    1313           0 :   Int len = nBuff * nRow * nAveChan;
    1314             : 
    1315           0 :   x.resize(len);
    1316           0 :   y.resize(len);
    1317           0 :   f.resize(len);
    1318             : 
    1319           0 :   int i = 0;
    1320           0 :   for ( auto pb : aveList ) {
    1321           0 :      if (pb != 0) {
    1322           0 :         for (int row = 0; row < nRow; row++) {
    1323           0 :            for (Int chn = 0; chn < nAveChan; chn++) {
    1324           0 :               Complex xxx = pb->visCube()(pol, chn, row);  
    1325           0 :               y(i) = xxx.real();
    1326           0 :               x(i) = pb->time()(row);  
    1327           0 :               f(i) = pb->flagCube()(pol, chn, row);
    1328           0 :               i++;
    1329             :            }
    1330             :            //showVisRow(aveV, 0);
    1331             :         }
    1332             :      }
    1333             :   }
    1334             : 
    1335           0 : }
    1336             : 
    1337           0 : void MsAverager::initAveBuffer(Double bufTime, 
    1338             :                                VisBuffer& aveBuff, Int /*nAnt*/, Int nChan)
    1339             : {
    1340             : 
    1341             :   
    1342           0 :   Int nRowAdd = baselineRow ();
    1343             :   //Int nRowAdd = baselineRow (nAnt, nAnt - 1, nAnt - 1) + 1;
    1344           0 :   aveBuff.nRow();
    1345           0 :   aveBuff.nRow() = nRowAdd;
    1346           0 :   aveBuff.nChannel() = nChan;
    1347             :   //cout << "nRowAdd=" << nRowAdd << endl;
    1348             : #if LOG2
    1349             :   cout << "initAveBuffer: bufTime=" << std::setprecision(12) << bufTime 
    1350             :        << " nRow=" << aveBuff.nRow() 
    1351             :        << " nChan=" << aveBuff.nChannel() 
    1352             :        << endl;
    1353             : #endif
    1354             : 
    1355           0 :   Int nRow = aveBuff.nRow();
    1356           0 :   aveBuff.antenna1().resize(nRow);
    1357           0 :   aveBuff.antenna2().resize(nRow);
    1358           0 :   aveBuff.time().resize(nRow);
    1359           0 :   aveBuff.timeInterval().resize(nRow);
    1360           0 :   aveBuff.uvw().resize(nRow);
    1361             :   //aveBuff.visibility().resize(nChan, nRow);
    1362             :   //aveBuff.flag().resize(nChan, nRow);
    1363           0 :   aveBuff.visCube().resize(nAvePol, nChan, nRow); 
    1364           0 :   aveBuff.flagCube().resize(nAvePol, nChan, nRow);
    1365           0 :   aveBuff.weightCube().resize(nAvePol, nChan, nRow);
    1366           0 :   aveBuff.modelVisCube().resize(nAvePol, nChan, nRow);
    1367           0 :   aveBuff.correctedVisCube().resize(nAvePol, nChan, nRow);
    1368           0 :   aveBuff.weight().resize(nRow);
    1369           0 :   aveBuff.flagRow().resize(nRow);
    1370           0 :   aveBuff.feed1().resize(nRow);
    1371             :   //aveBuff.feed2().resize(nRow);
    1372           0 :   aveBuff.sigma().resize(nRow);
    1373             : 
    1374           0 :   Int row = 0;
    1375             :   //for (Int ant1 = 0; ant1 < nAnt; ant1++) {
    1376             :   //  for (Int ant2 = ant1; ant2 < nAnt; ant2++) {
    1377             :   //    aveBuff.antenna1()(row) = ant1;
    1378             :   //    aveBuff.antenna2()(row) = ant2;
    1379             :   //    row++;
    1380             :   //  }
    1381             :   //}
    1382             : 
    1383           0 :   for (row = 0; row < nRow; row++) {
    1384           0 :     aveBuff.antenna1()(row) = baselines(row, 0);
    1385           0 :     aveBuff.antenna2()(row) = baselines(row, 1);
    1386           0 :     aveBuff.time()(row) = bufTime;
    1387           0 :     aveBuff.timeInterval()(row) = 0.0;
    1388           0 :     aveBuff.uvw()(row) = 0.0;
    1389           0 :     aveBuff.feed1()(row) = 0;
    1390           0 :     aveBuff.sigma()(row) = 0;
    1391             :     //aveBuff.feed2()(row) = 0;
    1392             :     //for (Int chn = 0; chn < nChan; chn++) {
    1393             :     //  aveBuff.visibility()(chn, row) = CStokesVector();
    1394             :     //  aveBuff.flag()(chn, row) = true;
    1395             :     //};
    1396           0 :     for (Int pol = 0; pol < nAvePol; pol++) {
    1397           0 :        for (Int chn = 0; chn < nChan; chn++) {
    1398           0 :          aveBuff.flagCube()(pol, chn, row) = !aveFlag;
    1399           0 :          aveBuff.visCube()(pol, chn, row) = 0;
    1400           0 :          aveBuff.weightCube()(pol, chn, row) = 0.;
    1401           0 :          aveBuff.modelVisCube()(pol, chn, row) = 0.;
    1402           0 :          aveBuff.correctedVisCube()(pol, chn, row) = 0.;
    1403             :        }
    1404             :     };
    1405           0 :     aveBuff.weight()(row) = 0.0f;
    1406           0 :     aveBuff.flagRow()(row) = !aveFlag;
    1407             :   };
    1408             :   //cout << "initAve: nRow=" << aveBuff.nRow() 
    1409             :   //     << " nChannel=" << aveBuff->nChannel() << endl;
    1410             :   
    1411             : 
    1412             : 
    1413           0 : }
    1414             : 
    1415             : 
    1416             : }
    1417             : 

Generated by: LCOV version 1.16