LCOV - code coverage report
Current view: top level - flagging/Flagging - ExtendFlagger.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 322 0.0 %
Date: 2024-10-28 15:53:10 Functions: 0 37 0.0 %

          Line data    Source code
       1             : //# ExtendFlagger.cc: 
       2             : //# Copyright (C) 1994,1995,1996,1997,1998,1999,2000,2001,2002,2003-2008
       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             : //# Includes
      30             : 
      31             : #include <cmath>
      32             : 
      33             : #include <casacore/casa/Exceptions.h>
      34             : 
      35             : #include <casacore/tables/TaQL/TableParse.h>
      36             : #include <casacore/tables/TaQL/TableGram.h>
      37             : #include <casacore/tables/Tables/TableDesc.h>
      38             : #include <casacore/tables/Tables/TableLock.h>
      39             : #include <casacore/tables/Tables/TableIter.h>
      40             : 
      41             : #include <casacore/casa/Arrays/ArrayMath.h>
      42             : #include <casacore/casa/Arrays/MatrixMath.h>
      43             : #include <casacore/casa/Arrays/ArrayError.h>
      44             : #include <casacore/casa/Arrays/Matrix.h>
      45             : 
      46             : #include <casacore/tables/TaQL/ExprMathNode.h>
      47             : #include <casacore/tables/TaQL/ExprMathNodeArray.h>
      48             : #include <casacore/tables/TaQL/ExprDerNode.h>
      49             : #include <casacore/tables/TaQL/ExprDerNodeArray.h>
      50             : #include <casacore/tables/TaQL/ExprFuncNode.h>
      51             : #include <casacore/tables/TaQL/ExprFuncNodeArray.h>
      52             : #include <casacore/tables/TaQL/ExprLogicNode.h>
      53             : #include <casacore/tables/TaQL/ExprLogicNodeArray.h>
      54             : #include <casacore/tables/TaQL/ExprNodeArray.h>
      55             : #include <casacore/tables/TaQL/ExprNodeSet.h>
      56             : #include <casacore/tables/TaQL/ExprNodeRep.h>
      57             : #include <casacore/tables/TaQL/ExprNodeRecord.h>
      58             : #include <casacore/tables/TaQL/ExprRange.h>
      59             : #include <casacore/tables/TaQL/RecordGram.h>
      60             : 
      61             : #include <casacore/casa/Utilities/DataType.h>
      62             : #include <casacore/casa/Utilities/Sort.h>
      63             : #include <casacore/casa/Quanta/MVTime.h>
      64             : #include <casacore/casa/System/ProgressMeter.h>
      65             : 
      66             : #include <flagging/Flagging/ExtendFlagger.h>
      67             : 
      68             : #include <iomanip>
      69             : 
      70             : using namespace casacore;
      71             : namespace casa { //# NAMESPACE CASA - BEGIN
      72             : 
      73           0 : int FlagID::compare (const void* val1, const void* val2) {
      74           0 :         const FlagID& t1 = *(FlagID*)val1;
      75           0 :         const FlagID& t2 = *(FlagID*)val2;
      76           0 :         if (t1.time < t2.time) return -1;
      77           0 :         if (t1.time > t2.time) return 1;
      78           0 :         if (t1.ant1 < t2.ant1) return -1;
      79           0 :         if (t1.ant1 > t2.ant1) return 1;
      80           0 :         if (t1.ant2 < t2.ant2) return -1;
      81           0 :         if (t1.ant2 > t2.ant2) return 1;
      82             :         //if (t1.field < t2.field) return -1;
      83             :         //if (t1.field > t2.field) return 1;
      84           0 :         if (t1.spw < t2.spw) return -1;
      85           0 :         if (t1.spw > t2.spw) return 1;
      86           0 :         if (t1.corr < t2.corr) return -1;
      87           0 :         if (t1.corr > t2.corr) return 1;
      88           0 :         if (t1.chan < t2.chan) return -1;
      89           0 :         if (t1.chan > t2.chan) return 1;
      90           0 :         if (t1.polid < t2.polid) return -1;
      91           0 :         if (t1.polid > t2.polid) return 1;
      92           0 :         return 0;
      93             : }
      94             : 
      95           0 : int FlagIDS::compareID (const void* val1, const void* val2) {
      96           0 :         const FlagIDS& t1 = *(FlagIDS*)val1;
      97           0 :         const FlagIDS& t2 = *(FlagIDS*)val2;
      98             :     // this condition makes no sense and produces a clang compiler warning
      99             :     // warning: reference cannot be bound to dereferenced null pointer in well-defined C++ code;
     100             :     // comparison may be assumed to always evaluate to true [-Wtautological-undefined-compare]
     101             :     // if (&t1 != 0 && &t2 != 0) {  
     102           0 :         cout << "t1=" << t1.time << " " << t2.time << endl;
     103           0 :         if (t1.time < t2.time) return -1;
     104           0 :         if (t1.time > t2.time) return 1;
     105           0 :         if (t1.bl < t2.bl) return -1;
     106           0 :         if (t1.bl > t2.bl) return 1;
     107             :         //if (t1.field < t2.field) return -1;
     108             :         //if (t1.field > t2.field) return 1;
     109           0 :         if (t1.spw < t2.spw) return -1;
     110           0 :         if (t1.spw > t2.spw) return 1;
     111           0 :         if (t1.corr < t2.corr) return -1;
     112           0 :         if (t1.corr > t2.corr) return 1;
     113           0 :         if (t1.chan < t2.chan) return -1;
     114           0 :         if (t1.chan > t2.chan) return 1;
     115             :     // } 
     116             :         
     117           0 :     return 0;
     118             : }
     119             : 
     120             : 
     121             : // Default Constructor 
     122           0 : ExtendFlagger::ExtendFlagger()
     123             : {
     124           0 :    initdata();
     125           0 :    clipexpr = "";
     126           0 :    cliprange.resize(0);
     127           0 :    clipcolumn = "DATA";
     128           0 :    outside = false;
     129           0 :    channelavg = false;
     130           0 :    quackinterval = 0.0;
     131           0 :    opmode = "flag";
     132           0 :    extendCorr = "";
     133           0 :    extendChan = "";
     134           0 :    extendAnt = "";
     135           0 :    extendSpw = "";
     136           0 :    extendTime = "";
     137           0 :    ableCorr.resize(0, 0);
     138           0 :    chanNum.resize(0);
     139           0 : }
     140             : 
     141           0 : ExtendFlagger::ExtendFlagger(MeasurementSet& ms, const String& exchan, 
     142             :                 const String& excorr, const String& exant, 
     143             :                 const String& exspw, const String& time,
     144           0 :                 const Vector<Vector<String> >& corrs, const Vector<Int>& nchan) {
     145           0 :    initdata();
     146           0 :    clipexpr = "";
     147           0 :    cliprange.resize(0);
     148           0 :    clipcolumn = "DATA";
     149           0 :    outside = false;
     150           0 :    channelavg = false;
     151           0 :    quackinterval = 0.0;
     152           0 :    opmode = "flag";
     153           0 :    extendCorr = excorr;
     154           0 :    extendChan = exchan;
     155           0 :    extendAnt = exant;
     156           0 :    extendSpw = exspw;
     157           0 :    extendTime = time;
     158           0 :    ableCorr = corrs;
     159           0 :    chanNum = nchan;
     160             :    
     161           0 :    flagger.attach(ms);
     162           0 : }
     163             : 
     164             : // Destructor 
     165           0 : ExtendFlagger::~ExtendFlagger()
     166             : {
     167           0 : }
     168             : 
     169             : // attach the ms to be flaggered
     170           0 : Bool ExtendFlagger::attach(MeasurementSet &ms) {
     171           0 :    return flagger.attach(ms);
     172             : }
     173             : 
     174             : // detach the ms 
     175           0 : void ExtendFlagger::detach() {
     176           0 :    flagger.detach();
     177           0 : }
     178             : 
     179             : // initialize flagging selection string 
     180           0 : Bool ExtendFlagger::initdata(const String& field, const String& spw, 
     181             :             const String& array, const String& feed, 
     182             :             const String& scan, const String& baseline,
     183             :             const String& uvrange, const String& time, 
     184             :             const String& correlation, const String& intent) {
     185             : 
     186           0 :    this->field = field;
     187           0 :    this->spw = spw;
     188           0 :    this->array = array;
     189           0 :    this->feed = feed;
     190           0 :    this->scan = scan;
     191           0 :    this->baseline = baseline;
     192           0 :    this->uvrange = uvrange;
     193           0 :    this->time = time;
     194           0 :    this->correlation = correlation;
     195           0 :    this->intent = intent;
     196           0 :    return true;
     197             : 
     198             : }
     199             : 
     200             : // set flagging selection string 
     201           0 : Bool ExtendFlagger::setdata() {
     202           0 :    return flagger.setdata(field, spw, array,
     203           0 :          feed, scan, baseline, uvrange, time, correlation, intent); 
     204             : }
     205             : 
     206             : // make data selection 
     207           0 : Bool ExtendFlagger::selectdata(Bool useoriginalms) {
     208             :    //cout << "useoriginalms=" << useoriginalms
     209             :    //     << " field=" << field << " spw=" << spw
     210             :    //     << " array=" << array << " feed=" << feed
     211             :    //     << " scan=" << scan << " baseline=" << baseline
     212             :    //     << " uvrange=" << uvrange << " time=" << time
     213             :    //     << " correlation=" << correlation << endl;
     214             :    //useoriginalms = false;
     215           0 :    return flagger.selectdata(useoriginalms, field, spw, array,
     216           0 :          feed, scan, baseline, uvrange, time, correlation, intent); 
     217             : }
     218             : 
     219             : // 
     220           0 : Bool ExtendFlagger::setmanualflags(Bool unflag, Bool autocorr) {
     221             :    //cout << "autocorr=" << autocorr << " rowflag=" << rowflag
     222             :    //     << " unflag=" << unflag 
     223             :    //     << " clipexpr=" << clipexpr << " cliprange=" << cliprange
     224             :    //     << " clipcolumn=" << clipcolumn << " outside=" << outside
     225             :    //     << " quackinterval=" << quackinterval << " opmode=" << opmode
     226             :    //     << endl;
     227           0 :    return flagger.setmanualflags(autocorr, unflag, clipexpr, 
     228           0 :         cliprange, clipcolumn, outside, channelavg, quackinterval, "beg", false, opmode);
     229             : }
     230             : 
     231           0 : Bool ExtendFlagger::run(Bool trial, Bool reset) {
     232           0 :   flagger.run(trial, reset);
     233           0 :   return true;
     234             : }
     235             : 
     236           0 : Bool ExtendFlagger::extend2(const Vector<FlagID>& flagids) {
     237             :    //cout << " extendCorr=" + extendCorr
     238             :    //     << " extendChan=" + extendChan
     239             :    //     << " extendSpw=" + extendSpw
     240             :    //     << " extendAnt=" + extendAnt
     241             :    //     << " extendTime=" + extendTime
     242             :    //     << endl;
     243           0 :    Int npts = flagids.size();
     244           0 :    if (npts == 0) {
     245           0 :       return false;
     246             :    } 
     247             : 
     248           0 :    Vector<FlagIDS> fids(npts);
     249           0 :    for (Int i = 0; i < npts; i++) {
     250             : 
     251           0 :       FlagIDS fid;
     252             : 
     253             :       //set chan
     254           0 :       if (!upcase(extendChan).compare("ALL")) {
     255           0 :           fid.chan = "";
     256             :       }
     257             :       else {
     258           0 :           fid.chan = flagids(i).chan;
     259             :       }
     260             : 
     261             :       //set spw
     262           0 :       if (!upcase(extendSpw).compare("ALL")) {
     263           0 :          fid.spw = ableSpw(flagids(i).spw);
     264             :       }
     265             :       else {
     266           0 :          fid.spw = String::toString(flagids(i).spw);
     267             :       }
     268             : 
     269             :       //set correlation
     270           0 :       if (!upcase(extendCorr).compare("ALL")) {
     271           0 :          fid.corr = "";
     272             :       }
     273           0 :       else if (!upcase(extendCorr).compare("HALF")) {
     274           0 :          fid.corr = halfExtendCorr(flagids(i).corr);
     275             :       }
     276             :       else {
     277           0 :          fid.corr = flagids(i).corr;
     278             :       }
     279             : 
     280             :       //set baseline
     281           0 :       if (!upcase(extendAnt).compare("ALL")) {
     282           0 :          fid.bl = "";
     283             :       }
     284             :       else {
     285           0 :          fid.bl = String::toString(flagids(i).ant1) +
     286           0 :                   String("&") +
     287           0 :                   String::toString(flagids(i).ant2);
     288             :       }
     289             : 
     290             :       //set time
     291           0 :       if (!upcase(extendTime).compare("ALL")) {
     292           0 :          fid.time = "";
     293             :       }
     294             :       else {
     295           0 :          fid.time = flagids(i).time;
     296             :       }
     297             : 
     298           0 :       fid.field = flagids(i).field;
     299             : 
     300           0 :       fids(i) = fid;
     301           0 :    }
     302             : 
     303           0 :    for (Int i = 0; i < npts; i++) { 
     304           0 :       fids[i].show();
     305             :    }
     306             : 
     307           0 :    Vector<uInt> indexV(npts); 
     308           0 :    Vector<uInt> uniqueV(npts); 
     309           0 :    Sort sort;
     310             :    //sort.sortKey (&fids, &(FlagIDS::compareID), sizeof(FlagIDS));
     311           0 :    sort.sortKey (&fids[0].spw, TpString, sizeof(FlagIDS));
     312           0 :    sort.sortKey (&fids[0].time, TpString, sizeof(FlagIDS));
     313           0 :    sort.sortKey (&fids[0].bl, TpString, sizeof(FlagIDS));
     314           0 :    sort.sortKey (&fids[0].corr, TpString, sizeof(FlagIDS));
     315           0 :    sort.sortKey (&fids[0].chan, TpString, sizeof(FlagIDS));
     316             : 
     317             :    uInt sr = 
     318           0 :      sort.sort (indexV, npts);
     319             : 
     320           0 :    uInt ur = sort.unique (uniqueV, indexV);
     321             :    cout 
     322           0 :           << "npts=" << npts
     323           0 :           << " sorted=" << sr 
     324           0 :           << " unique=" << ur
     325           0 :           << endl;
     326             : 
     327           0 :    Bool ret = true;
     328           0 :    for (uInt i = 0; i < ur; i++) {
     329             : 
     330           0 :       FlagIDS usFlag = fids[indexV(uniqueV(i))];
     331             :       // set spw:chan
     332             :       // need to be careful of the variable shape spws
     333           0 :       if (usFlag.chan.length() > 0) {
     334           0 :          setSpw(usFlag.spw + String(":") + usFlag.chan); 
     335             :       }
     336             :       else {
     337           0 :          setSpw(usFlag.spw);
     338             :       }
     339             : 
     340             :       //set correlation
     341           0 :       setCorrelation(usFlag.corr);
     342             : 
     343             :       //set baseline
     344           0 :       setBaseline(usFlag.bl);
     345             : 
     346             :       //set time
     347           0 :       setTime(usFlag.time);
     348             : 
     349           0 :       setField(String::toString(usFlag.field));
     350             : 
     351           0 :       selectdata();
     352           0 :       setmanualflags(unflag);
     353           0 :    }
     354             :    try {
     355           0 :      ret = run();
     356             :    }
     357           0 :    catch (AipsError ex) {
     358           0 :       LogIO log;
     359           0 :            log<<LogIO::WARN<< LogOrigin("Flagger")
     360             :            <<ex.getMesg()
     361           0 :            <<LogIO::POST;
     362           0 :    }
     363             : 
     364           0 :    return ret;
     365           0 : }
     366             : 
     367           0 : Bool ExtendFlagger::extend(const Vector<FlagID>& flagids) {
     368             :    //cout << " extendCorr=" + extendCorr
     369             :    //     << " extendChan=" + extendChan
     370             :    //     << " extendSpw=" + extendSpw
     371             :    //     << " extendAnt=" + extendAnt
     372             :    //     << " extendTime=" + extendTime
     373             :    //     << endl;
     374           0 :    Int npts = flagids.size();
     375           0 :    if (npts == 0) {
     376           0 :       return false;
     377             :    } 
     378             : 
     379           0 :    Bool ret = true;
     380           0 :    for (Int i = 0; i < npts; i++) {
     381           0 :       String chanstr = flagids(i).chan;
     382           0 :       if (!upcase(extendChan).compare("ALL")) {
     383           0 :           chanstr = "";
     384             :       }
     385             : 
     386           0 :       String spwstr = String::toString(flagids(i).spw);
     387           0 :       if (!upcase(extendSpw).compare("ALL")) {
     388           0 :          spwstr = ableSpw(flagids(i).spw);
     389             :       }
     390             : 
     391             :       // set spw:chan
     392             :       // need to be careful of the variable shape spws
     393           0 :       if (chanstr.length() > 0) {
     394           0 :          setSpw(spwstr + String(":") + chanstr); 
     395             :       }
     396             :       else {
     397           0 :          setSpw(spwstr);
     398             :       }
     399             : 
     400             :       //set correlation
     401           0 :       if (!upcase(extendCorr).compare("ALL")) {
     402           0 :          setCorrelation("");
     403             :       }
     404           0 :       else if (!upcase(extendCorr).compare("HALF")) {
     405           0 :          setCorrelation(halfExtendCorr(flagids(i).corr));
     406             :       }
     407             :       else {
     408           0 :          setCorrelation(flagids(i).corr);
     409             :       }
     410             : 
     411             :       //set baseline
     412             :       // flagids.ant1 is the ant id, we need ant name
     413             :       //String blstr = String::toString(flagids(i).ant1) +
     414             :       //                String("&") +
     415             :       //                String::toString(flagids(i).ant2);
     416             : 
     417             :       //const MSAntennaColumns & antColumn  = ms.antenna();
     418             :       //const ScalarColumn<String> antNames = antColumn.name();
     419             :       //String blstr = (antColumn.name())(flagids(i).ant1) +
     420             :       //                 String("&") +
     421             :       //               (antColumn.name())(flagids(i).ant2);
     422             :       
     423           0 :       String blstr = "";
     424             :       try {
     425           0 :          Vector<String> ants = flagger.antNames();
     426           0 :          blstr = ants(flagids(i).ant1) +
     427           0 :                  String("&") +
     428           0 :                  ants(flagids(i).ant2);
     429           0 :       }
     430           0 :       catch(...) {}
     431             :       
     432           0 :       if (!upcase(extendAnt).compare("ALL")) {
     433           0 :          setBaseline("");
     434             :       }
     435             :       else {
     436           0 :          setBaseline(blstr);
     437             :       }
     438             : 
     439             :       //set time
     440           0 :       String timestr = flagids(i).time;
     441           0 :       if (!upcase(extendTime).compare("ALL")) {
     442           0 :          setTime("");
     443             :       }
     444             :       else {
     445           0 :          setTime(timestr);
     446             :       }
     447             : 
     448           0 :       setField(String::toString(flagids(i).field));
     449             : 
     450           0 :       selectdata();
     451           0 :       setmanualflags(unflag);
     452             :       //ret = run();
     453             :       
     454             :       //show(); 
     455           0 :    }
     456             :    try {
     457           0 :      ret = run();
     458             :    }
     459           0 :    catch (AipsError ex) {
     460           0 :       LogIO log;
     461           0 :       log<<LogIO::WARN << LogOrigin("Flagger")
     462             :                 <<ex.getMesg()
     463           0 :           <<LogIO::POST;
     464           0 :    }
     465             :    
     466             : 
     467           0 :    return ret;
     468             : }
     469             : 
     470             : 
     471           0 : void ExtendFlagger::show() {
     472           0 :     cout << "time=" << time
     473           0 :       << " spw=" << spw
     474           0 :       << " field=" << field
     475             :       //String array;
     476             :       //String feed;
     477             :       //String scan;
     478           0 :       << " baseline=" << baseline
     479             :       //String uvrange;
     480           0 :       << " corr=" << correlation
     481           0 :       << endl;
     482           0 : }
     483             : 
     484           0 : void ExtendFlagger::setUnflag(Bool unflg) {
     485           0 :    this->unflag = unflg; 
     486           0 : }
     487             : 
     488           0 : void ExtendFlagger::setField(const String& field) {
     489           0 :    this->field = field; 
     490           0 : }
     491             : 
     492           0 : void ExtendFlagger::setSpw(const String& spw) {
     493           0 :    this->spw = spw;
     494           0 : }
     495             : 
     496           0 : void ExtendFlagger::setArray(const String& array) {
     497           0 :    this->array = array;
     498           0 : }
     499             : 
     500           0 : void ExtendFlagger::setFeed(const String& feed) {
     501           0 :    this->feed = feed;
     502           0 : }
     503             : 
     504           0 : void ExtendFlagger::setScan(const String& scan) {
     505           0 :    this->scan = scan;
     506           0 : }
     507           0 : void ExtendFlagger::setBaseline(const String& baseline) {
     508           0 :    this->baseline = baseline;
     509           0 : }
     510             : 
     511           0 : void ExtendFlagger::setUvrange(const String& uvrange) {
     512           0 :    this->uvrange = uvrange;
     513           0 : }
     514             : 
     515           0 : void ExtendFlagger::setTime(const String& time) {
     516           0 :    this->time = time;
     517           0 : }
     518             : 
     519           0 : void ExtendFlagger::setCorrelation(const String& correlation) {
     520           0 :    this->correlation = correlation;
     521           0 : }
     522             : 
     523           0 : void ExtendFlagger::setIntent(const String& intent) {
     524           0 :    this->intent = intent;
     525           0 : }
     526             : 
     527           0 : void ExtendFlagger::setExtendChan(const String& exchan) {
     528           0 :    this->extendChan = exchan;
     529           0 : }
     530             : 
     531           0 : void ExtendFlagger::setExtendCorr(const String& excorr) {
     532           0 :    this->extendCorr = excorr;
     533           0 : }
     534           0 : void ExtendFlagger::setExtendAnt(const String& exant) {
     535           0 :    this->extendAnt = exant;
     536           0 : }
     537             : 
     538           0 : void ExtendFlagger::setExtendSpw(const String& exspw) {
     539           0 :    this->extendSpw = exspw;
     540           0 : }
     541             : 
     542           0 : void ExtendFlagger::setExtendTime(const String& time) {
     543           0 :    this->extendTime = time;
     544           0 : }
     545             : 
     546           0 : void ExtendFlagger::setExtend(const String& exchan, const String& excorr,
     547             :                 const String& exspw, const String& exant, const String& time,
     548             :                 const Vector<Vector<String> >& cname, const Vector<Int>& nchan) {
     549           0 :    this->extendCorr = excorr;
     550           0 :    this->extendChan = exchan;
     551           0 :    this->extendAnt = exant;
     552           0 :    this->extendSpw = exspw;
     553           0 :    this->extendTime = time;
     554           0 :    this->ableCorr = cname;
     555           0 :    this->chanNum = nchan;
     556           0 : }
     557             : 
     558           0 : void ExtendFlagger::setAbleCorr(const Vector<Vector<String> >& corrName) {
     559           0 :    this->ableCorr = corrName;
     560           0 : }
     561             : 
     562           0 : void ExtendFlagger::setChanNum(const Vector<Int>& nchan) {
     563           0 :    this->chanNum = nchan;
     564           0 : }
     565             : 
     566           0 : String ExtendFlagger::halfExtendCorr(const String& corr, const uInt pid) {
     567           0 :    String ex = corr;
     568           0 :    if (ableCorr.size() > pid) {
     569           0 :       uInt corrCount = ableCorr[pid].nelements();
     570           0 :       if (corrCount == 2) {
     571           0 :          return corr;
     572             :       }
     573             :       //cout << "corr=" << corr << " corrCount=" << corrCount << endl;
     574           0 :       if (corrCount == 4) {
     575           0 :          uInt i = 0;
     576           0 :          for (i = 0; i < corrCount; i++) {
     577           0 :             if (corr.length() > 0 && !upcase(corr).compare(ableCorr[pid][i])) {
     578           0 :                break;
     579             :             }
     580             :          }
     581           0 :          if (i == 0) {
     582           0 :             return ableCorr[pid][0] + "," +
     583           0 :                    ableCorr[pid][1] + "," +
     584           0 :                    ableCorr[pid][2];
     585             :          }
     586           0 :          if (i == 1) {
     587           0 :             return ableCorr[pid][0] + "," +
     588           0 :                    ableCorr[pid][1] + "," +
     589           0 :                    ableCorr[pid][3];
     590             :          }
     591           0 :          if (i == 2) {
     592           0 :             return ableCorr[pid][0] + "," +
     593           0 :                    ableCorr[pid][2] + "," +
     594           0 :                    ableCorr[pid][3];
     595             :          }
     596           0 :          if (i == 3) {
     597           0 :             return ableCorr[pid][1] + "," +
     598           0 :                    ableCorr[pid][2] + "," +
     599           0 :                    ableCorr[pid][3];
     600             :          }
     601             :       }
     602             :    }
     603           0 :    return "";
     604           0 : }
     605             : 
     606           0 : String ExtendFlagger::ableSpw(const Int spw) {
     607           0 :    String ex = "";
     608           0 :    Int nspw = chanNum.nelements();
     609           0 :    if (nspw > spw) {
     610           0 :       Int nchan = chanNum[spw];
     611           0 :       for (Int i = 0; i < nspw; i++) {
     612           0 :          if (chanNum[i] == nchan) {
     613           0 :             ex += String(";") + String::toString(i);
     614             :          }
     615             :       }
     616           0 :       return ex.after(";");
     617             :    }
     618           0 :    return "";
     619           0 : }
     620             : 
     621             : 
     622             : } //# NAMESPACE CASA - END 

Generated by: LCOV version 1.16