LCOV - code coverage report
Current view: top level - flagging/Flagging - RFATimeFreqCrop.tcc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 0 642 0.0 %
Date: 2024-10-04 18:58:15 Functions: 0 32 0.0 %

          Line data    Source code
       1             : //# RFATimeFreqCrop.cc: this defines RFATimeFreqCrop
       2             : //# Copyright (C) 2000,2001,2002
       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             : #include <flagging/Flagging/RFATimeFreqCrop.h>
      29             : 
      30             : namespace casa { //# NAMESPACE CASA - BEGIN
      31             : 
      32             :   //#define baselinecnt ( (NumAnt)*((NumAnt)+1)/2 - ((NumAnt)-ant1[bs])*((NumAnt)-ant1[bs]+1)/2 + (ant2[bs] - ant1[bs]) )
      33             : #define SELF(ant) ( (NumAnt)*((NumAnt)+1)/2 - ((NumAnt)-ant)*((NumAnt)-ant+1)/2 )
      34             : #define MIN(a,b) ((a)<=(b) ? (a) : (b))
      35             : 
      36             : //#define PLOT  // to activate the mean and clean bandpass plots
      37             : //#define UPLOT // to activate bandpass plots of each fit iteration
      38             : 
      39             : //#define DOPLOT  // to activate ds9 and bandpass-fit plots
      40             : 
      41             : /* Constructor for 'RFATimeFreqCrop' */
      42           0 : RFATimeFreqCrop :: RFATimeFreqCrop( RFChunkStats &ch,const casacore::RecordInterface &parm ):
      43             :                             RFAFlagCubeBase(ch,parm) ,
      44             :                             RFDataMapper(parm.asArrayString(RF_EXPR),parm.asString(RF_COLUMN)),
      45           0 :                             vi(ch.visIter()),
      46           0 :                             vb(ch.visBuf())
      47             : {
      48           0 :         ANT_TOL = parm.asDouble("ant_cutoff");
      49           0 :         BASELN_TOL = parm.asDouble("baseline_cutoff");
      50           0 :         T_TOL = parm.asDouble("time_amp_cutoff");
      51           0 :         F_TOL = parm.asDouble("freq_amp_cutoff");
      52           0 :         FlagLevel = parm.asInt("flag_level");
      53           0 :         CorrChoice = parm.asInt("auto_cross");
      54           0 :         NumTime = parm.asInt("num_time");
      55           0 :         ShowPlots = parm.asBool("showplots");
      56           0 :         FreqLineFit = parm.asBool("freqlinefit");
      57           0 :         MaxNPieces = parm.asInt("maxnpieces");
      58           0 :         DryRun = parm.asBool("dryrun");
      59           0 :         Expr = parm.asArrayString(RF_EXPR);
      60           0 :         Column = parm.asString(RF_COLUMN);
      61           0 :         IgnorePreflags = parm.asBool(RF_FIGNORE);
      62             :         //      cout << "Flagging on " << parm.asArrayString(RF_EXPR) << " for column : " << parm.asString(RF_COLUMN) << endl;
      63           0 :         StopAndExit=false;
      64             :         /*
      65             :         if(ShowPlots)
      66             :         {
      67             :            cmd = "xpaset -p ds9 plot new name flagger \n";
      68             :            system(cmd.data());
      69             :         }
      70             :         */
      71             : 
      72           0 : }
      73             : 
      74             : 
      75             : /* Sets default values to parameters */
      76           0 : const casacore::RecordInterface & RFATimeFreqCrop::getDefaults ()
      77             : {
      78           0 :  static casacore::Record rec;
      79           0 : if( !rec.nfields() )
      80             :        {
      81           0 :         rec = RFAFlagCubeBase::getDefaults();
      82           0 :         rec.define(RF_NAME,"RFATimeFreqCrop");
      83           0 :         rec.define(RF_EXPR,"ABS I");
      84           0 :         rec.define(RF_COLUMN,"DATA");
      85           0 :         rec.define("ant_cutoff",0);
      86           0 :         rec.define("baseline_cutoff",0);
      87           0 :         rec.define("time_amp_cutoff",3);
      88           0 :         rec.define("freq_amp_cutoff",3);
      89           0 :         rec.define("flag_level",1);
      90           0 :         rec.define("auto_cross",1);
      91           0 :         rec.define("num_time",50);
      92           0 :         rec.define("column","DATA");
      93           0 :         rec.define("expr","ABS I");
      94           0 :         rec.define("fignore",false);
      95           0 :         rec.define("showplots",false);
      96           0 :         rec.define("freqlinefit",false);
      97           0 :         rec.define("maxnpieces",6);
      98           0 :         rec.define("dryrun",false);
      99             : //      rec.setcomment("ant_cutoff","Total autocorrelation amplitude threshold for a functional antenna");
     100             : //      rec.setcomment("time_amp_cutoff","Multiple/fraction of standard deviation, to set the threshold, while flagging across time");
     101             : //      rec.setcomment("freq_amp_cutoff","Multiple/fraction of standard deviation, to set the threshold, while flagging across frequency");
     102             : //      rec.setcomment("flag_level","Levels of Flagging");
     103             :        }
     104           0 :      return rec;
     105             : }
     106             : 
     107             : 
     108             : 
     109             : /* Called at the beginning of each chunk of data */
     110           0 : casacore::Bool RFATimeFreqCrop :: newChunk (casacore::Int &i)
     111             : {
     112           0 :   casacore::LogIO os(casacore::LogOrigin("tfcrop","newChunk","WHERE"));
     113             : 
     114           0 :   if(StopAndExit) 
     115             :     {
     116             :       //      cout << "newChunk :: NOT Working with data chunk : " << chunk.msName() << endl;
     117           0 :       return false;
     118             :     }
     119             : 
     120             :  
     121             :  //     cout << "newChunk :: Working with data chunk : " << chunk.msName() << endl;
     122             :  //     cout << "TimeSteps = " << num(TIME) << ", Baselines = " << num(IFR) << ", Chans = " << num(CHAN) << ", Polns = " << num(POLZN) << ", Ants = " << num(ANT) << endl;
     123             :  //     cout << "Parameters : " << " Antenna_tol=" << ANT_TOL << ", Baseline_tol=" << BASELN_TOL << ", Time_tol=" << T_TOL << "sigma, Freq_tol=" << F_TOL << "sigma, FlagLevel=" << FlagLevel << ", Flag_corr=" << casacore::String(CorrChoice?"Cross":"Auto") << endl;
     124             : 
     125             :         /* Initialize NumT - number of timestamps to work with in one go */
     126           0 :         if(NumTime==0) NumTime=50;
     127           0 :         if(num(TIME) >= NumTime) NumT = NumTime;
     128           0 :         else NumT = num(TIME);
     129             :         
     130             :         /* Assume that all baselines are present in this chunk */
     131             :         // TODO : check this.
     132           0 :        NumAnt = num(ANT);
     133           0 :        NumB = ((NumAnt)*((NumAnt)-1)/2 + (NumAnt));
     134             : 
     135             :        /* Number of polarizations */
     136           0 :        NumP = num(POLZN);
     137             :        //UUU : FORCE it to be 1 for now.....
     138           0 :        NumP=1;
     139             : 
     140             :        /* Number of channels */
     141           0 :         NumC = num(CHAN);
     142             : 
     143             :         /* Polarizations/correlations */
     144             : 
     145           0 :         corrmask = RFDataMapper::corrMask(chunk.visIter());
     146           0 :         casacore::Vector<casacore::Int> corrlist(num(POLZN));
     147           0 :         for(casacore::uInt corr=0; corr<num(POLZN); corr++)
     148           0 :           corrlist[corr] = (casacore::Int) ( (corrmask >> corr) & 1 );
     149             :         
     150             :         /* Check that the above makes sense */
     151           0 :         if(NumC<1 || NumP<1 || NumB <1 || NumAnt<1 || NumT<1)
     152             :           {
     153           0 :             cout << "Invalid chunk shapes" << endl;
     154           0 :             return false;
     155             :           }
     156             : 
     157             :         //      os << "Chunk=" << chunk.nchunk() << ", Field=" << chunk.visIter().fieldName() << ", FieldID=" << chunk.visIter().fieldId() << ", Spw=" << chunk.visIter().spectralWindow() << ", nTime=" << num(TIME) << " (" << NumT << " at a time), nBaseline=" << num(IFR) << ", nChan=" << num(CHAN) << ", nCorrs=" << num(POLZN) << " [" << chunk.getCorrString() << "]" <<  casacore::LogIO::POST;
     158             :         //cout << "Chunk=" << chunk.nchunk() << ", Field=" << chunk.visIter().fieldName() << ", FieldID=" << chunk.visIter().fieldId() << ", Spw=" << chunk.visIter().spectralWindow() << ", nTime=" << num(TIME) << " (" << NumT << " at a time), nBaseline=" << num(IFR) << ", nChan=" << num(CHAN) << ", nCorrs=" << num(POLZN) << " [" << chunk.getCorrString() << "]" <<  endl; // ". Flagging on " << Expr << endl; //" ->  correlations : " << corrlist << endl;
     159             :         //        cout << "Working with " << NumC << " x " << NumT << " subsets (nchan x ntime),  "<< Expr << " on the " << Column << " column, and applying flags to correlations : " << corrlist << endl;
     160             : 
     161             : 
     162             :         /* UUU : What is this ? */
     163             :         //       RFAFlagCubeBase::newChunk(i-=1);
     164             :        
     165             :        /* Allocate memory for one set of NumT timesteps. */
     166           0 :         AllocateMemory();
     167             : 
     168           0 :         return RFAFlagCubeBase::newChunk(i);
     169           0 : }
     170             : 
     171             : 
     172             : /* Called at the beginning of each PASS */
     173           0 : void RFATimeFreqCrop :: startData (bool verbose) 
     174             : {
     175             :   //  cout  << "StartData - reset time-counter" << endl;
     176             : 
     177           0 :         RFAFlagCubeBase::startData(verbose);
     178             : 
     179           0 :         iterTimecnt=0; // running count of visbuffers gone by.
     180           0 :         timecnt=0;
     181             :   
     182             :         ///     (chunk.visIter()).setRowBlocking(0); 
     183             : 
     184           0 : }
     185             : 
     186           0 : void RFATimeFreqCrop :: AllocateMemory()
     187             : {
     188             :         
     189             :         /* casacore::Cube to hold visibility amplitudes : POLZN x CHAN x (IFR*TIME) */
     190           0 :         visc.resize(NumP,NumC,NumB*NumT);
     191           0 :         visc=0;
     192             :         
     193             :         /* casacore::Cube to hold visibility flags : POLZN x CHAN x (IFR*TIME) */
     194           0 :         flagc.resize(NumP,NumC,NumB*NumT);
     195           0 :         flagc=true;
     196             : 
     197             :         /* casacore::Vector to hold Row Flags : (IFR*TIME) */
     198           0 :         rowflags.resize(NumB*NumT);
     199           0 :         rowflags=true;
     200             : 
     201             :         /* casacore::Vector to hold baseline flags - to prevent unnecessary computation */
     202           0 :         baselineflags.resize(NumB);
     203           0 :         baselineflags=false;
     204             :         
     205             :         /* casacore::Cube to hold MEAN bandpasses : POLZN x IFR x CHAN */
     206             :         /* casacore::Cube to hold CLEAN bandpasses : POLZN x IFR x CHAN */
     207           0 :         if(CorrChoice == 0)
     208             :           {
     209           0 :                 meanBP.resize(NumP,NumAnt,NumC);
     210           0 :                 cleanBP.resize(NumP,NumAnt,NumC);
     211             :           }
     212             :         else
     213             :           {
     214           0 :                 meanBP.resize(NumP,NumB,NumC);
     215           0 :                 cleanBP.resize(NumP,NumB,NumC);
     216             :           }
     217             : 
     218           0 :         matpos = meanBP.shape();
     219           0 :         meanBP=0.0;
     220           0 :         cleanBP=0.0;
     221             : 
     222             :         //      cout << " BP Shape = " << matpos << endl;
     223             : 
     224             :         /* casacore::Cube to hold flags for the entire Chunk (channel subset, but all times) */
     225           0 :         chunkflags.resize(NumP,NumC,NumB*num(TIME));
     226           0 :         chunkflags=true;
     227             : 
     228             :         
     229             :         /* Temporary workspace vectors */       
     230           0 :         tempBP.resize(NumC);tempTS.resize(NumT);
     231           0 :         flagBP.resize(NumC);flagTS.resize(NumT);
     232           0 :         fitBP.resize(NumC);fitTS.resize(NumT);
     233             : 
     234           0 :         tempBP=0;tempTS=0;flagBP=false;flagTS=false;fitBP=0;fitTS=0;
     235             : 
     236             : 
     237           0 : }
     238             : 
     239             : 
     240             : 
     241             : /* Called once for every TIMESTAMP - for each VisBuf */
     242           0 : RFA::IterMode RFATimeFreqCrop :: iterTime (casacore::uInt itime) 
     243             : {
     244             :   
     245             :   //    cout << "iterTime :: " << itime << endl;
     246             :   //    RFAFlagCubeBase::iterTime(itime);
     247           0 :     RFDataMapper::setVisBuffer(vb);
     248           0 :    flag.advance(itime,true);
     249             :     
     250             :     //    vv = &vb.visCube(); // extract a viscube - one timestamp - one VisBuf
     251             :     //    vi.flag(ff); // extract the corresponding flags
     252             :     
     253           0 :     if(ant1.shape() != (vb.antenna1()).shape())
     254           0 :         ant1.resize((vb.antenna1()).shape());
     255           0 :     ant1 = vb.antenna1();
     256             :     
     257           0 :     if(ant2.shape() != (vb.antenna2()).shape())
     258           0 :         ant2.resize((vb.antenna2()).shape());
     259           0 :     ant2 = vb.antenna2();
     260             :     //const casacore::Vector<casacore::Int> &ifrs( chunk.ifrNums() );
     261             :     
     262           0 :     casacore::uInt nBaselinesInData = ant1.nelements();
     263             :     //    cout << "ant1 nelements  : " << nBaselinesInData << " timecnt : " << timecnt << " itertimecnt : " << iterTimecnt << endl;
     264             : 
     265             :       /* Polarizations/correlations */
     266           0 :       corrmask = RFDataMapper::corrMask(chunk.visIter());
     267           0 :       casacore::Vector<casacore::Int> corrlist(num(POLZN));
     268           0 :       for(casacore::uInt corr=0; corr<num(POLZN); corr++)
     269           0 :         corrlist[corr] = (casacore::Int) ( (corrmask >> corr) & 1 );
     270             : 
     271             :       //      if(nBaselinesInData != num(IFR)) cout << "nbaselines is not consistent !" << endl; 
     272             :         
     273             :     // Read in the data AND any existing flags into the flagCube - accumulate 
     274             :     //   timecnt : casacore::Time counter for each NumT subset
     275             :     //   itime : The row counter for each chunk
     276             :     casacore::Bool tfl;
     277           0 :     for(casacore::uInt pl=0;pl<NumP;pl++)
     278             :       {
     279           0 :         for(casacore::uInt bs=0;bs<nBaselinesInData;bs++)
     280             :           {
     281           0 :             casacore::Int countflags=0, countpnts=0;
     282           0 :             casacore::uInt baselinecnt = BaselineIndex(bs,ant1[bs],ant2[bs]);
     283           0 :             AlwaysAssert( baselinecnt<NumB, casacore::AipsError );
     284             :             // Read in rowflag
     285           0 :             rowflags( (timecnt*NumB)+baselinecnt ) = flag.getRowFlag( chunk.ifrNum(bs), itime);
     286           0 :             for(casacore::uInt ch=0;ch<NumC;ch++)
     287             :               {
     288             :                 // read the data. mapvalue evaluates 'expr'.
     289           0 :                 visc(pl,ch,(timecnt*NumB)+baselinecnt) = mapValue(ch,bs);
     290             :                 // read existing flags
     291           0 :                 tfl = chunk.npass() ? flag.anyFlagged(ch,chunk.ifrNum(bs)) : flag.preFlagged(ch,chunk.ifrNum(bs));
     292             :                 // sync with rowflag
     293           0 :                 if( rowflags( (timecnt*NumB)+baselinecnt ) ) tfl=true;
     294             :                 // ignore previous flags....
     295           0 :                 if(IgnorePreflags) tfl=false;
     296             :  
     297             :                 // Fill in the NumT sized flag array
     298           0 :                 flagc(pl,ch,(timecnt*NumB)+baselinecnt) = tfl; //flag.anyFlagged(ch,ifrs(bs));
     299             : 
     300             :                 // Fill in the chunk sized flag array
     301           0 :                 chunkflags(pl,ch,(itime*NumB)+baselinecnt) = tfl; //flag.anyFlagged(ch,ifrs(bs));
     302             :                 
     303             :                 // Counters
     304           0 :                 countpnts++;
     305           0 :                 if(tfl) countflags ++;
     306             :               }
     307             :             //      if(countflags>0) cout << "Time : " << itime << " Preflags for baseline : " << bs << " (" << ant1(bs) << "," << ant2(bs) << ") : " << countflags << " out of " << countpnts << " " << corrlist << endl;
     308             :           }
     309             :       }
     310             :     
     311           0 :     timecnt++;
     312           0 :     iterTimecnt++; // running count of visbuffers going by.
     313             :     
     314             :     
     315             :     /* BEGIN TIME-FLAGGING ALGORITHM HERE */
     316             :     
     317             :     /* After accumulating NumT timestamps, start processing this block */
     318             :     /////if(iterTimecnt > 0 && (timecnt==NumT || iterTimecnt == (vi.nRowChunk()/NumB)))
     319           0 :     if(iterTimecnt > 0 && (timecnt==NumT || itime==(num(TIME)-1) ))
     320             :       {
     321             :         //ut << " timecnt : " << timecnt << "   itime : " << itime << "  iterTimecnt : " << iterTimecnt << "   NumT : " << NumT << endl;
     322             :         //        casacore::Int ctimes = timecnt;
     323           0 :         casacore::Int ctimes = NumT; // User-specified time-interval
     324           0 :         NumT = timecnt; // Available time-interval. Usually same as NumT - but could be less.
     325             :         //ut << " NumT going into all functions : " << NumT << endl;
     326             : 
     327           0 :         FlagZeros();            
     328             : 
     329           0 :         RunTFCrop();
     330             :         
     331           0 :         if(ShowFlagPlots() == RFA::STOP)
     332           0 :           return RFA::STOP;
     333             :         
     334           0 :         ExtendFlags();
     335             :         
     336           0 :         FillChunkFlags();    
     337             : 
     338             :         // reset NumT to the user-specified time-interval
     339           0 :         NumT = ctimes;  
     340             : 
     341             :         // reset the NumT time counter !!!
     342           0 :         timecnt=0;
     343             :       }
     344             :     //    flag.advance(itime,true);
     345           0 :     return RFA::CONT; 
     346             :     ////RFAFlagCubeBase::iterTime(itime);
     347           0 : }
     348             : 
     349             : 
     350             : /* Called for each ROW - each baseline in a VisBuf */
     351             : // Fill in the visibilities and flags here.
     352             : // flag.advance() has to get called in iterTime, for iterRow to see the correct values.
     353           0 : RFA::IterMode RFATimeFreqCrop :: iterRow  (casacore::uInt irow ) 
     354             : {
     355           0 :   AlwaysAssert( irow <= NumT*NumB , casacore::AipsError);
     356             :   /* DUMMY CALL */
     357           0 :   return RFAFlagCubeBase::iterRow(irow);
     358             : }
     359             : 
     360             : 
     361             : 
     362             : /* If any data points are exactly zero, make sure corresponding flags
     363             :    are set. For the baseline mapper - this is an indicator of which baselines
     364             :    are missing (RowFlags */
     365           0 : void RFATimeFreqCrop :: FlagZeros()
     366             : {
     367           0 :   casacore::Float temp=0;
     368             :   //casacore::Bool flg=false;
     369           0 :   baselineflags=false;
     370             :   
     371             :   /* Check if the data in all channels are filled with zeros.
     372             :      If so, set the flags to zero  */    
     373             :   /* Also, if rowflags are set, set flags to zero. */
     374             :   /* Also, if all chans and times are flagged for a baseline, set the baselineflag
     375             :      baselineflag is used internally to skip unnecessary baselines */
     376             :   
     377           0 :   for(casacore::uInt pl=0;pl<NumP;pl++)
     378             :     {
     379           0 :       for(casacore::uInt bs=0;bs<NumB;bs++)
     380             :         {
     381           0 :           casacore::Bool bflag=true; // default is flagged. If anything is unflagged, this will change to false
     382           0 :           for(casacore::uInt tm=0;tm<NumT;tm++)
     383             :             {
     384             :               // If rowflag is set, flag all chans in it
     385           0 :               if(rowflags(tm*NumB+bs))
     386             :                 {
     387           0 :                   for(casacore::uInt ch=0;ch<NumC;ch++)
     388           0 :                     flagc(pl,ch,tm*NumB+bs) = true;
     389             :                 }
     390             :               
     391             :               // Count flags across channels, and also count the data.
     392           0 :               temp=0;
     393             :               //flg=true;
     394           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
     395             :                 {
     396           0 :                   temp += visc(pl,ch,tm*NumB+bs);
     397             :                   //flg &= flagc(pl,ch,tm*NumB+bs);
     398             :                 }
     399             :               
     400             :               // If data is zero for all channels (not read in), set flags to zero.
     401           0 :               if(temp==0) 
     402             :                 {
     403           0 :                   rowflags(tm*NumB+bs)=true;
     404           0 :                   for(casacore::uInt ch=0;ch<NumC;ch++)
     405           0 :                     flagc(pl,ch,tm*NumB+bs)=true;
     406             :                 }
     407             :               
     408             :               // Count flags across channels and time,,,,,
     409             :               // If any flag is false, bflag will become false
     410           0 :               for(casacore::uInt ch=0; ch<NumC; ch++)
     411           0 :                 bflag &= flagc(pl,ch,tm*NumB+bs);
     412             :               
     413             :             }// for tm
     414             :           // If all times/chans are flagged for this baseline, set the baselineflag.
     415           0 :           if(bflag) baselineflags(bs)=true;
     416           0 :           else baselineflags(bs)=false;
     417             :         }// for bs
     418           0 :       casacore::Int ubs=0;
     419           0 :       for(casacore::uInt bs=0;bs<NumB;bs++)
     420           0 :            if(!baselineflags(bs)) ubs++;
     421           0 :       if(ShowPlots) cout << "Working with " << ubs << " unflagged baseline(s). " << endl;
     422             :     }// for pl
     423           0 : }// end of FlagZeros()
     424             : 
     425             : 
     426             : 
     427             : 
     428           0 : void RFATimeFreqCrop :: RunTFCrop()
     429             : {
     430             :   casacore::uInt a1,a2;
     431             :   
     432           0 :   meanBP = 0;
     433           0 :   cleanBP = 0;
     434             :   
     435           0 :   for(casacore::uInt pl=0;pl<NumP;pl++)
     436             :     {
     437           0 :       for(casacore::uInt bs=0;bs<NumB;bs++)
     438             :         {
     439           0 :           if( !baselineflags(bs) )
     440             :             {
     441           0 :               Ants(bs,&a1,&a2);
     442           0 :               if((CorrChoice==0 && a1 == a2)||(CorrChoice!=0 && a1 != a2)) 
     443             :                 {
     444             :                   
     445           0 :                   FlagTimeSeries(pl,bs);    
     446             :                   
     447           0 :                   FitCleanBandPass(pl,bs);
     448             :                   
     449           0 :                   FlagBandPass(pl,bs);
     450             :                   
     451           0 :                   GrowFlags(pl,bs);
     452             :                 }// if corrchoice
     453             :             }// if baseline is not flagged
     454             :         }// end for bs
     455             :     }// end for pl  
     456             :   
     457           0 : }// end runTFCrop
     458             : 
     459             : 
     460             : 
     461             : 
     462             : /* Flag in time, and build the average bandpass */
     463             : /* Grow flags by one timestep, check for complete flagged baselines. */
     464           0 : void RFATimeFreqCrop :: FlagTimeSeries(casacore::uInt pl, casacore::uInt bs)
     465             : {
     466             :   //casacore::Float mn=0;
     467           0 :   casacore::Float sd=0,temp=0,flagcnt=0,tol=0;
     468             :   casacore::uInt a1,a2;
     469             :   //casacore::Bool flg=false;
     470             :   /* For each Channel - fit lines to 1-D data in time - flag according 
     471             :    * to them and build up the mean bandpass */
     472             :   
     473           0 :   casacore::Float rmean=0;
     474           0 :   Ants(bs,&a1,&a2);
     475             :           //                    cout << " Antennas : " << a1 << " & " << a2 << endl;
     476           0 :           for(casacore::uInt ch=0;ch<NumC;ch++)
     477             :             {
     478           0 :               tempTS=0;flagTS=false;
     479           0 :               for(casacore::uInt tm=0;tm<NumT;tm++)
     480             :                 {
     481           0 :                   tempTS[tm] = visc(pl,ch,((tm*NumB)+bs));
     482           0 :                   flagTS[tm] = flagc(pl,ch,((tm*NumB)+bs));
     483             :                 }//for tm
     484             :               
     485             :               
     486           0 :               rmean += UMean(tempTS,flagTS);
     487             :               
     488           0 :               temp=0;
     489           0 :               for(int loop=0;loop<5;loop++)
     490             :                 {
     491             :                   // UUU : HERE - give choice of PolyFit in time...
     492           0 :                   LineFit(tempTS,flagTS,fitTS,0,tempTS.nelements()-1);  
     493           0 :                   sd = UStd(tempTS,flagTS,fitTS);
     494             :                   
     495           0 :                   for(casacore::uInt i=0;i<NumT;i++)
     496           0 :                     if(flagTS[i]==false && fabs(tempTS[i]-fitTS[i]) > T_TOL*sd)
     497             :                       {
     498           0 :                         flagTS[i]=true ;flagcnt++;
     499             :                       }
     500           0 :                   if(fabs(temp-sd) < 0.1)break;
     501           0 :                   temp=sd;
     502             :                 }
     503             :               
     504             :               // If sum of 2 adjacent flags also crosses threshold, flag 
     505             :               /*
     506             :               for(casacore::uInt i=1;i<NumT-1;i++)
     507             :                 {
     508             :                   if(flagTS[i])
     509             :                     {
     510             :                       if( ( fabs(tempTS[i-1]-fitTS[i-1]) + fabs(tempTS[i+1]-fitTS[i+1]) ) > T_TOL*sd )
     511             :                         {flagTS[i-1]=true; flagTS[i+1]=true;}
     512             :                     }
     513             :                 }
     514             :               */
     515             :               
     516           0 :               meanBP(pl,bs,ch) = UMean(tempTS,flagTS) ;
     517             :               
     518             :               /* write flags to local flag cube */
     519           0 :               for(casacore::uInt tm=0;tm<NumT;tm++)
     520           0 :                 flagc(pl,ch,((tm*NumB)+bs))=flagTS[tm];
     521             :               
     522             :             }//for ch
     523             :           
     524             :           
     525             :           /* Check for completely flagged ants/bs */
     526             :           if(1)
     527             :             {
     528           0 :               if((CorrChoice==0 && a1 == a2)||(CorrChoice!=0 && a1 != a2)) 
     529             :                 {
     530           0 :                   if(CorrChoice==0)tol=ANT_TOL;
     531           0 :                   else tol=BASELN_TOL;
     532           0 :                   if(fabs(rmean/float(NumC)) < tol)
     533             :                     {
     534           0 :                       for(casacore::uInt ch=0;ch<NumC;ch++)
     535           0 :                         for(casacore::uInt tm=0;tm<NumT;tm++)
     536           0 :                           flagc(pl,ch,((tm*NumB)+bs))=true;
     537           0 :                       if(CorrChoice==0) 
     538           0 :                         cout << "Antenna Flagged : " << a1 << endl;
     539             :                       else
     540           0 :                         cout << "Mean : " << rmean/NumC << " : Baseline Flagged : " << a1 << ":" << a2 << endl;
     541             :                     }
     542             :                   
     543             :                 }
     544             :             }///if(0);          
     545           0 : }// end of FlagTimeSeries    
     546             : 
     547             : /* Fit a smooth bandpass to the mean bandpass and store it 
     548             :  *  one for each baseline */
     549             : 
     550             : // matpos  :  NumP. NumB. NumC
     551             : 
     552           0 : void RFATimeFreqCrop :: FitCleanBandPass(casacore::uInt pl, casacore::uInt bs)
     553             : {    
     554             :   //casacore::Float mn=0,sd=0,temp=0,flagcnt=0,tol=0;
     555             :   casacore::uInt a1,a2;
     556           0 :   casacore::Bool flg=false;
     557             :   
     558           0 :           Ants(bs,&a1,&a2);
     559             :           /* Fit a smooth bandpass */
     560           0 :           flg=true;
     561           0 :           for(casacore::uInt ch=0;ch<NumC;ch++)      
     562             :             {
     563           0 :               tempBP[ch] = meanBP(pl,bs,ch);
     564           0 :               if(tempBP[ch] != 0) flg=false;
     565             :             }
     566             :           
     567           0 :           if(flg==false)
     568             :             {
     569             :               /* Piecewise Poly Fit to the meanBP */
     570           0 :               if(!FreqLineFit)
     571             :                 {
     572           0 :                   CleanBand(tempBP,fitBP);      
     573             :                 }
     574             :               else
     575             :                 {
     576             :                   /* LineFit to flag off a line fit in frequency */
     577           0 :                   flagBP=false;
     578           0 :                   for(casacore::uInt ch=0;ch<tempBP.nelements();ch++)
     579           0 :                     if(tempBP[ch]==0) flagBP[ch]=true;
     580           0 :                   LineFit(tempBP,flagBP,fitBP,0,tempBP.nelements()-1);  
     581             :                 }
     582             :               
     583             : #ifdef PLOT 
     584             :               if(CorrChoice==0)
     585             :                 cout<<" Antenna : "<<bs<<" Polzn : "<<pl<<endl;
     586             :               else
     587             :                 {
     588             :                   Ants(bs,&a1,&a2);
     589             :                   cout << " Baseline : " << a1 << ":" << a2 << " Polzn : " << pl << endl;
     590             :                 }
     591             :               Plot_ds9(tempBP.nelements(), tempBP,fitBP);  // Plot the band
     592             : #endif
     593             :             }
     594             :           /*      else
     595             :                   {
     596             :                   Ants(bs,&a1,&a2);
     597             :                   emptylist += casacore::String::toString(a1)+"-"+casacore::String::toString(a2)+" ";
     598             :                   //             cout << "meanBP is filled with zeros : baseline : " << a1 << "-" << a2 << endl;
     599             :                   }
     600             :           */
     601           0 :           for(casacore::uInt ch=0;ch<NumC;ch++)
     602             :             {
     603           0 :               if(flg==false) cleanBP(pl,bs,ch)= fitBP[ch];
     604           0 :               else cleanBP(pl,bs,ch)=0;
     605             :             }
     606             :           
     607           0 : }// end FitCleanBandPass    
     608             : 
     609             : /* FLAGGING IN FREQUENCY */
     610           0 : void RFATimeFreqCrop :: FlagBandPass(casacore::uInt pl, casacore::uInt bs)
     611             : {
     612           0 :   casacore::Float mn=0,sd=0,temp=0,flagcnt=0;
     613             :   casacore::uInt a1,a2;
     614             :   //casacore::Bool flg=false;
     615             :   
     616             : 
     617           0 :           Ants(bs,&a1,&a2);
     618             :           
     619           0 :           for(casacore::uInt tm=0;tm<NumT;tm++)
     620             :             {
     621             :               /* Divide (or subtract) out the clean bandpass */
     622           0 :               tempBP=0,flagBP=0;
     623           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
     624             :                 {
     625           0 :                   flagBP[ch] = flagc(pl,ch,((tm*NumB)+bs));
     626           0 :                   if(flagBP[ch]==false)
     627           0 :                     tempBP[ch] = visc(pl,ch,((tm*NumB)+bs))/cleanBP(pl,bs,ch);
     628             :                 }//for ch
     629             :               
     630             :               /* Flag outliers */
     631           0 :               temp=0;
     632           0 :               for(casacore::Int loop=0;loop<5;loop++)
     633             :                 {
     634           0 :                   mn=1;
     635           0 :                   sd = UStd(tempBP,flagBP,mn);
     636             :                   
     637           0 :                   for(casacore::uInt ch=0;ch<NumC;ch++)
     638             :                     {
     639           0 :                       if(flagBP[ch]==false && fabs(tempBP[ch]-mn) > F_TOL*sd)
     640             :                         {
     641           0 :                           flagBP[ch]=true ;flagcnt++;
     642             :                         }
     643             :                     }
     644           0 :                   if(fabs(temp-sd) < 0.1)break;
     645           0 :                   temp=sd;
     646             :                 }
     647             :               
     648             :               /* If sum of power in two adjacent channels is more than thresh, flag both side chans */
     649           0 :               if(FlagLevel>0)
     650             :                 {
     651           0 :               for(casacore::uInt ch=1;ch<NumC-1;ch++)
     652             :                 {
     653           0 :                   if(flagBP[ch])
     654             :                     {
     655           0 :                       if( ( fabs(tempBP[ch-1]-mn) + fabs(tempBP[ch+1]-mn) ) > F_TOL*sd )
     656           0 :                         {flagBP[ch-1]=true; flagBP[ch+1]=true;}
     657             :                     }
     658             :                 }
     659             :                 }
     660             : 
     661             :               /* Fill the flags into the visbuffer array */
     662           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
     663           0 :                 flagc(pl,ch,((tm*NumB)+bs))=flagBP[ch];
     664             :               
     665             :               
     666             :             }//for tm
     667             :           
     668           0 : }// end FlagBandPass    
     669             : 
     670             : /* APPLY FLAG HEURISTICS ON THE FLAGS FOR ALL AUTOCORRELATIONS */
     671           0 : void RFATimeFreqCrop :: GrowFlags(casacore::uInt pl, casacore::uInt bs)
     672             : {
     673             :   casacore::uInt a1,a2;
     674             :   //casacore::Bool flg=false;
     675             :   
     676           0 :   if(FlagLevel > 0)
     677             :     {
     678           0 :               Ants(bs,&a1,&a2);
     679             :               
     680           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
     681             :                 { 
     682             :                   // casacore::uInt fsum=0;
     683           0 :                   for(casacore::uInt tm=0;tm<NumT;tm++)
     684             :                     {       
     685           0 :                       if(FlagLevel>1) // flag level 2 and above...
     686             :                         {
     687             :                           // flagging one timestamp before and after
     688           0 :                           if(tm>0)
     689           0 :                             if(flagc(pl,ch,((tm*NumB+bs)))==true)
     690           0 :                               flagc(pl,ch,(((tm-1)*NumB+bs)))=true;
     691             :                           
     692           0 :                           if((NumT-tm)<NumT-1)
     693           0 :                             if(flagc(pl,ch,(((NumT-tm)*NumB+bs)))==true)
     694           0 :                               flagc(pl,ch,(((NumT-tm+1)*NumB+bs)))=true;
     695             :                         }
     696             :                       
     697           0 :                       if(FlagLevel>1) // flag level 2 and above
     698             :                         {
     699             :                           // flagging one channel before and after
     700           0 :                           if(ch>0)
     701           0 :                             if(flagc(pl,ch,((tm*NumB+bs)))==true)
     702           0 :                               flagc(pl,ch-1,((tm*NumB+bs)))=true;
     703             :                           
     704           0 :                           if((NumC-ch)<NumC-1)
     705           0 :                             if(flagc(pl,(NumC-ch),(tm*NumB+bs))==true)
     706           0 :                               flagc(pl,(NumC-ch+1),(tm*NumB+bs))=true;
     707             :                         }
     708             :                       
     709           0 :                       if(FlagLevel>0) // flag level 1 and above
     710             :                         {
     711             :                           /* If previous and next channel are flagged, flag it */
     712           0 :                           if(ch>0 && ch < NumC-1)
     713             :                             {
     714           0 :                               if( flagc(pl,ch-1,(tm*NumB+bs) ) == true 
     715           0 :                                   && flagc(pl,ch+1,(tm*NumB+bs) ) == true  )
     716           0 :                                 flagc(pl,ch,(tm*NumB+bs) ) = true;
     717             :                             }
     718             :                           /* If previous and next timestamp are flagged, flag it */
     719           0 :                           if(tm>0 && tm < NumT-1)
     720             :                             {
     721           0 :                               if( flagc(pl,ch,((tm-1)*NumB+bs) ) == true 
     722           0 :                                   && flagc(pl,ch,((tm+1)*NumB+bs) ) == true  )
     723           0 :                                 flagc(pl,ch,(tm*NumB+bs) ) = true;
     724             :                             }
     725             :                         }
     726             :                       
     727           0 :                       if(FlagLevel>1) // flag level 2 and above
     728             :                         {
     729             :                           /* If next two channels are flagged, flag it */
     730           0 :                           if(ch < NumC-2)
     731           0 :                             if( flagc(pl,ch+1,(tm*NumB+bs)) == true 
     732           0 :                                 && flagc(pl,ch+2,(tm*NumB+bs) ) == true  )
     733           0 :                               flagc(pl,ch,(tm*NumB+bs) ) = true;
     734             :                         }
     735             :                       
     736             :                     }//for tm
     737             :                   
     738             :                   // if more than 60% of the timetange flagged - flag whole timerange for that channel
     739             :                   //if(fsum < 0.4*NumT && FlagLevel > 1) // flag level 2 
     740             :                   //    for(casacore::uInt tm=0;tm<NumT;tm++)
     741             :                   //            flagc(pl,ch,((tm*NumB+bs)))=true;
     742             :                 }//for ch
     743             :               
     744           0 :               if(FlagLevel>0) // flag level 1 and above
     745             :                 {
     746             :                   /* If more than 4 surrounding points are flagged, flag it */
     747           0 :                   casacore::uInt fsum2=0;
     748           0 :                   for(casacore::uInt ch=1;ch<NumC-1;ch++)
     749             :                     {
     750           0 :                       for(casacore::uInt tm=1;tm<NumT-1;tm++)
     751             :                         {
     752           0 :                           fsum2 = (casacore::uInt)(flagc(pl,ch-1,(((tm-1)*NumB+bs)))) + (casacore::uInt)(flagc(pl,ch-1,((tm*NumB+bs)))) + 
     753           0 :                             (casacore::uInt)(flagc(pl,ch-1,(((tm+1)*NumB+bs)))) + (casacore::uInt)(flagc(pl,ch,(((tm-1)*NumB+bs)))) + 
     754           0 :                             (casacore::uInt)(flagc(pl,ch,(((tm+1)*NumB+bs)))) + (casacore::uInt)(flagc(pl,ch+1,(((tm-1)*NumB+bs)))) + 
     755           0 :                             (casacore::uInt)(flagc(pl,ch+1,((tm*NumB+bs)))) + (casacore::uInt)(flagc(pl,ch+1,(((tm+1)*NumB+bs))));
     756           0 :                           if(fsum2 > 4) flagc(pl,ch,((tm*NumB+bs))) = true;
     757             :                         } // for tm
     758             :                     }// for ch
     759             :                 }// if FlagLevel>0
     760             :               
     761           0 :               if(FlagLevel>0) // flaglevel = 1 and above
     762             :                 {
     763           0 :                   casacore::uInt fsum2=0;
     764             :                   /* Grow flags in time */
     765           0 :                   for(casacore::uInt ch=0;ch<NumC;ch++)
     766             :                     { 
     767           0 :                       fsum2=0;
     768             :                       /* count unflagged points for this channel (all times) */
     769           0 :                       for(casacore::uInt tm=0;tm<NumT;tm++)
     770           0 :                         fsum2 += (flagc(pl,ch,((tm*NumB+bs)))==true)?0:1 ; 
     771             :                       /*if more than 50% of the timetange flagged - flag whole timerange for that channel */
     772           0 :                       if(fsum2 < 0.5*NumT)
     773           0 :                         for(casacore::uInt tm=0;tm<NumT;tm++)
     774           0 :                           flagc(pl,ch,((tm*NumB+bs)))=true;
     775             :                     }// for ch
     776             :                 }// if flaglevel>0
     777             :               
     778             :     }//if flag_level
     779             :   
     780             :   // Count flags
     781             :   /*
     782             :     casacore::Float runningcount=0, runningflag=0;
     783             :     runningcount=0;
     784             :     runningflag=0;
     785             :     for(int pl=0;pl<NumP;pl++)
     786             :     {
     787             :     for(casacore::uInt bs=0;bs<NumB;bs++)
     788             :     {
     789             :     Ants(bs,&a1,&a2);
     790             :     if(CorrChoice==0)
     791             :     {if(a1 != a2) continue;} // choose autocorrelations
     792             :     else
     793             :     {if(a1==a2) continue;} // choose cross correlations
     794             :     
     795             :     for(int ch=0;ch<NumC;ch++)
     796             :     {
     797             :     for(casacore::uInt tm=0;tm<NumT;tm++)
     798             :     {
     799             :     runningflag += casacore::Float(flagc(pl,ch,(tm*NumB)+bs));
     800             :     runningcount++ ;
     801             :     }// for tm
     802             :     }//for ch
     803             :     }// for bs
     804             :     }// for pl
     805             :     
     806             :     
     807             :     cout << " Flagged : " << 100 * runningflag/runningcount << " % for timesteps " << iterTimecnt-NumT << " - " << iterTimecnt << endl;
     808             :   */
     809           0 : }// end of GrowFlags
     810             : 
     811             : /* GRAY SCALE DISPLAYS ON ds9 */
     812           0 : RFA::IterMode RFATimeFreqCrop :: ShowFlagPlots()
     813             : {    
     814             :   casacore::uInt a1,a2;
     815           0 :   if(ShowPlots)
     816             :     {
     817             :       
     818             :       //        cout << "About to display : allocating cubes" << endl;    
     819             :       /*      
     820             :               casacore::Float **dispdat=NULL,**flagdat=NULL;
     821             :               dispdat = (casacore::Float **) malloc(sizeof(casacore::Float *) * NumT + sizeof(casacore::Float)*NumC*NumT);
     822             :               for(casacore::uInt i=0;i<NumT;i++)
     823             :               dispdat[i] = (casacore::Float *) (dispdat + NumT) + i * NumC;
     824             :               
     825             :               flagdat = (casacore::Float **) malloc(sizeof(casacore::Float *) * NumT + sizeof(casacore::Float)*NumC*NumT);
     826             :               for(casacore::uInt i=0;i<NumT;i++)
     827             :               flagdat[i] = (casacore::Float *) (flagdat + NumT) + i * NumC;
     828             :       */
     829             :       
     830           0 :       casacore::IPosition shp(2),tshp(2); shp(0)=NumC; shp(1)=NumT;
     831           0 :       casacore::Matrix<casacore::Float> dispdat(shp), flagdat(shp);
     832             :       
     833             :       //        cout << "About to display : allocated. "  << endl;
     834             :       
     835           0 :       char choice = 'a';
     836             :       
     837           0 :       casacore::Float runningsum=0, runningflag=0, oldrunningflag=0;
     838           0 :       for(casacore::uInt pl=0;pl<NumP;pl++)
     839             :         {
     840           0 :           if(choice == 's') continue;
     841           0 :           for(casacore::uInt bs=0;bs<NumB;bs++)
     842             :             {
     843           0 :               if(choice == 's') continue;
     844           0 :               if(baselineflags(bs)) continue;
     845             :               
     846           0 :               runningsum=0;
     847           0 :               runningflag=0;
     848           0 :               oldrunningflag=0;
     849           0 :               Ants(bs,&a1,&a2);
     850           0 :               if(CorrChoice==0)
     851           0 :                 {if(a1 != a2) continue;} // choose autocorrelations
     852             :               else
     853           0 :                 {if(a1==a2) continue;} // choose cross correlations
     854             :               
     855           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)  
     856             :                 {
     857           0 :                   tempBP[ch] = meanBP(pl,bs,ch);
     858           0 :                   fitBP[ch] = cleanBP(pl,bs,ch);
     859             :                 }
     860             :               
     861           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
     862             :                 { 
     863           0 :                   for(casacore::uInt tm=0;tm<NumT;tm++)
     864             :                     {       
     865             :                       // casacore::Data with pre-flags
     866           0 :                       dispdat(ch,tm) = visc(pl,ch,(((tm*NumB)+bs))) * (!chunkflags(pl,ch,((tm+iterTimecnt-NumT)*NumB)+bs));
     867             :                       // casacore::Data with all flags (pre and new)
     868           0 :                       flagdat(ch,tm) = dispdat(ch,tm)*(!flagc(pl,ch,(tm*NumB)+bs));
     869             :                       // Sum of the visibilities (all of them, flagged and unflagged)
     870           0 :                       runningsum += visc(pl,ch,(((tm*NumB)+bs)));
     871             :                       /*
     872             :                       // Count of all flags
     873             :                       runningflag += (casacore::Float)(flagc(pl,ch,(tm*NumB)+bs));
     874             :                       // Count of only pre-flags
     875             :                       oldrunningflag += (casacore::Float)(chunkflags(pl,ch,((tm+iterTimecnt-NumT)*NumB)+bs));
     876             :                       */  ////// CHECK that iterTimecnt is correct, and a valid part of chunkflags is being read !!!!!!!!!
     877             :                       // Count of all flags
     878           0 :                       if( (flagc(pl,ch,(tm*NumB)+bs)) ) runningflag++;
     879             :                       // Count of only pre-flags
     880           0 :                       if(chunkflags(pl,ch,((tm+iterTimecnt-NumT)*NumB)+bs)) oldrunningflag++;
     881             :                     }//for tm
     882             :                 }//for ch
     883             :               
     884             :               //Plot on ds9 !!
     885             :               
     886             :               //                cout << "Antenna1 : " << a1 << "  Antenna2 : " << a2 << "  Polarization : " << pl << endl;
     887             :               //                cout << "Vis sum : " << runningsum << " Flag % : " << 100 * runningflag/(NumC*NumT) << endl;
     888             :               //              cout << " Flagged : " << 100 * runningflag/(NumC*NumT) << " %" << endl;
     889           0 :               cout << " Flagged : " << 100 * runningflag/(NumC*NumT) << " %  (Pre-Flag : " << 100 * oldrunningflag/(NumC*NumT) << " %) on " << Expr << " for timesteps " << iterTimecnt-NumT << " - " << iterTimecnt << " on baseline " << a1 << "-" << a2;
     890             :               
     891           0 :               if(!runningsum)
     892             :                 {
     893           0 :                   cout << " : No non-zero data !" << endl;
     894             :                 }
     895             :               else
     896             :                 {
     897           0 :                   cout << endl;
     898             :                   
     899           0 :                   Display_ds9(NumC,NumT,dispdat,1);
     900           0 :                   Display_ds9(NumC,NumT,flagdat,2);
     901           0 :                   Plot_ds9(tempBP.nelements(), tempBP, fitBP);
     902             :                   //UPlot(tempBP,fitBP,0,tempBP.nelements()-1);  // Plot the band
     903             :                   
     904           0 :                   cout << "Press <c> to continue display, <s> to stop display but continue flagging, <q> to quit." << endl;
     905             :                   //getchar();
     906           0 :                   cin >> choice;
     907             :                   //                cout << " Choice : " << choice << endl;
     908           0 :                   switch(choice)
     909             :                     {
     910           0 :                     case 'q': 
     911           0 :                       ShowPlots = false; 
     912           0 :                       StopAndExit = true;
     913           0 :                       cout << "Exiting flagger" << endl;
     914           0 :                       return RFA::STOP;
     915           0 :                     case 's': 
     916           0 :                       ShowPlots = false;
     917           0 :                       cout << "Stopping display. Continuing flagging." << endl;
     918           0 :                       break;
     919           0 :                     default:
     920           0 :                       break;
     921             :                     }
     922             :                 }
     923             :             }//for bs
     924             :         }//for pl
     925             :       
     926           0 :     }// end of if ShowPlots
     927           0 :     return RFA::CONT;
     928             : }// end ShowFlagPlots
     929             : 
     930             : /* Extend Flags
     931             :    (1) If flagging on self-correlations, extend to cross-corrs.
     932             :    (2) If requested, extend across polarization (fiddle with corrmask)
     933             :    (3) If requested, extend across baseline/antenna
     934             : */
     935           0 : void RFATimeFreqCrop :: ExtendFlags()
     936             : {    
     937             :   casacore::uInt a1,a2;
     938             :   
     939             :   /* FLAG BASELINES FROM THE SELF FLAGS */
     940           0 :   if(CorrChoice ==0)
     941             :     {   
     942           0 :       cout << " Flagging Cross correlations from self correlation flags " << endl;
     943           0 :       for(casacore::uInt pl=0;pl<NumP;pl++)
     944             :         {
     945           0 :           for(casacore::uInt bs=0;bs<NumB;bs++)
     946             :             {
     947           0 :               if(baselineflags(bs)) continue;
     948           0 :               Ants(bs,&a1,&a2);
     949           0 :               if(a1 == a2) continue; // choose cross correlations
     950           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
     951             :                 {
     952           0 :                   for(casacore::uInt tm=0;tm<NumT;tm++)
     953             :                     {
     954           0 :                       flagc(pl,ch,((tm*NumB+bs))) = flagc(pl,ch,((tm*NumB)+SELF(a1))) | flagc(pl,ch,((tm*NumB)+SELF(a1))); 
     955             :                     }//for tm
     956             :                 }//for ch
     957             :             }//for bs
     958             :         }//for pl
     959             :     }
     960             :   
     961           0 : }// end Extend Flags    
     962             : 
     963           0 : void RFATimeFreqCrop :: FillChunkFlags()
     964             : {
     965             :   //cout << " Diagnostics on flag cube " << endl;
     966             :   
     967           0 :   for(casacore::uInt pl=0;pl<NumP;pl++)
     968             :     {
     969           0 :       for(casacore::uInt bs=0;bs<NumB;bs++)
     970             :         {
     971             :           //if(RowFlags(pl,(tm*NumB)+bs)==true)
     972             :           //    continue;
     973           0 :           for(casacore::uInt ch=0;ch<NumC;ch++)
     974             :             {
     975           0 :               for(casacore::uInt tm=0;tm<NumT;tm++)
     976             :                 {
     977           0 :                   if(flagc(pl,ch,((tm*NumB)+bs))==true )  
     978             :                     {
     979           0 :                       chunkflags(pl,ch,((tm+iterTimecnt-NumT)*NumB)+bs) = true;
     980             :                     }
     981             :                 }// for tm
     982             :             }//for ch
     983             :         }// for bs
     984             :     }// for pl
     985             :   
     986             :   // what is this ??  
     987           0 :   timecnt=0;
     988             :   
     989           0 : }// end of FillChunkFlags
     990             : 
     991             : 
     992             : 
     993             : /*RedFlagger::run - ends loop for all agents with endData 
     994             :  * Calls endData once at the end of each PASS */
     995           0 : RFA::IterMode RFATimeFreqCrop :: endData  () 
     996             : {
     997             :   //  cout << " In End Data. Ending timecnt :  "  << timecnt << endl;
     998             :   
     999           0 :   RFAFlagCubeBase::endData();
    1000           0 :   return RFA::STOP;
    1001             : }
    1002             : 
    1003             : 
    1004             : /* Called at the beginning of each PASS */
    1005           0 : void RFATimeFreqCrop :: startFlag (bool verbose) 
    1006             : {
    1007             :   //  corrmask = RFDataMapper::corrMask(chunk.visIter());
    1008             :   //  cout  << "StartFlag : corrmask : " << corrmask << endl;
    1009             :   
    1010           0 :   RFAFlagCubeBase::startFlag(verbose);
    1011             :   
    1012           0 : }
    1013             : 
    1014             : 
    1015             : /* Write Flags to casacore::MS */
    1016           0 : void RFATimeFreqCrop :: iterFlag(casacore::uInt itime)
    1017             : {
    1018             :   //  cout << "iterFlag :: Set flags for time : " << itime << endl;
    1019             :   
    1020             :   // FLAG DATA
    1021             :   
    1022           0 :   if(!DryRun)
    1023             :     {
    1024           0 :       flag.advance(itime);
    1025           0 :       corrmask = RFDataMapper::corrMask(chunk.visIter());
    1026             :       
    1027           0 :       const casacore::Vector<casacore::Int> &ifrs( chunk.ifrNums() );
    1028           0 :       if(ant1.shape() != (vb.antenna1()).shape())
    1029           0 :         ant1.resize((vb.antenna1()).shape());
    1030           0 :       ant1 = vb.antenna1();
    1031             :       
    1032           0 :       if(ant2.shape() != (vb.antenna2()).shape())
    1033           0 :         ant2.resize((vb.antenna2()).shape());
    1034           0 :       ant2 = vb.antenna2();
    1035             :       
    1036           0 :       casacore::uInt nbs = ant1.nelements();
    1037           0 :       for(casacore::uInt pl=0;pl<NumP;pl++)
    1038             :         {
    1039           0 :           for(casacore::uInt bs=0;bs<nbs;bs++)
    1040             :             {
    1041           0 :               casacore::Bool bflag=true;
    1042           0 :               casacore::uInt baselinecnt = BaselineIndex(bs,ant1[bs],ant2[bs]);
    1043           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
    1044             :                 {
    1045           0 :                   if(chunkflags(pl,ch,(itime*NumB)+baselinecnt)==(casacore::Bool)true)
    1046           0 :                     flag.setFlag(ch,ifrs(bs));
    1047           0 :                   bflag &= chunkflags(pl,ch,(itime*NumB)+baselinecnt);
    1048             :                 }
    1049           0 :               if(bflag) flag.setRowFlag(ifrs(bs),itime);
    1050             :             }
    1051             :         }
    1052             :       
    1053           0 :       flag.setMSFlags(itime);
    1054             :       
    1055             :     }// if not dry-run
    1056             :   else
    1057             :     {
    1058           0 :       RFAFlagCubeBase::iterFlag(itime);
    1059             :     }
    1060             :   
    1061             :   /// FLAG ROWS  
    1062             :   /*
    1063             :     ant1 = vb.antenna1();
    1064             :     ant2 = vb.antenna2();
    1065             :     casacore::uInt npols = (chunkflags.shape())[0];
    1066             :     casacore::uInt nbs = ant1.nelements();
    1067             :     
    1068             :     vi.flag(ff);
    1069             :     vi.flagRow(fr);
    1070             :     
    1071             :     for(casacore::uInt bs=0;bs<nbs;bs++)
    1072             :     {
    1073             :     casacore::Bool rowflag=true;
    1074             :     for(casacore::uInt pl=0;pl<npols;pl++)
    1075             :     {
    1076             :     for(casacore::uInt ch=StartChan;ch<=EndChan;ch++)
    1077             :     {
    1078             :     ff(pl,ch,bs) = chunkflags(pl,ch-StartChan,(itime*NumB)+baselinecnt);
    1079             :     rowflag &= ff(pl,ch,bs);
    1080             :     }
    1081             :     }
    1082             :     if(rowflag) fr[bs]=true;
    1083             :     }
    1084             :     
    1085             :     //vi.setFlag(ff);
    1086             :     //vi.setFlagRow(fr); 
    1087             :     
    1088             :     chunk.visIter().setFlag(ff);
    1089             :     chunk.visIter().setFlagRow(fr);
    1090             :     
    1091             :   */
    1092           0 : }
    1093             : 
    1094             : /*RedFlagger::run - calls 'endChunk()' on all agents. */
    1095             : 
    1096           0 : void RFATimeFreqCrop :: endChunk () 
    1097             : {
    1098           0 :   casacore::LogIO os(casacore::LogOrigin("tfcrop","endChunk","WHERE"));
    1099             :   //     cout << "endChunk : counting flags" << endl;
    1100             :   // Count flags
    1101           0 :   if(!StopAndExit)
    1102             :     {
    1103           0 :       casacore::Float runningcount=0, runningflag=0;
    1104             :       
    1105             :       //const casacore::Vector<casacore::Int> &ifrs( chunk.ifrNums() );
    1106           0 :       if(ant1.shape() != (vb.antenna1()).shape())
    1107           0 :         ant1.resize((vb.antenna1()).shape());
    1108           0 :       ant1 = vb.antenna1();
    1109             :       
    1110           0 :       if(ant2.shape() != (vb.antenna2()).shape())
    1111           0 :         ant2.resize((vb.antenna2()).shape());
    1112           0 :       ant2 = vb.antenna2();
    1113             :       
    1114           0 :       casacore::uInt nbs = ant1.nelements();
    1115           0 :       for(casacore::uInt pl=0;pl<NumP;pl++)
    1116             :         {
    1117           0 :           for(casacore::uInt bs=0;bs<nbs;bs++)
    1118             :             {
    1119           0 :               casacore::uInt baselinecnt = BaselineIndex(bs,ant1[bs],ant2[bs]);
    1120           0 :               for(casacore::uInt ch=0;ch<NumC;ch++)
    1121             :                 {
    1122           0 :                   for(casacore::uInt tm=0;tm<num(TIME);tm++)
    1123             :                     {
    1124           0 :                       if (chunkflags(pl,ch,((tm)*NumB)+baselinecnt)) runningflag++;
    1125           0 :                       runningcount++;
    1126             :                     }
    1127             :                 }
    1128             :             }
    1129             :         }
    1130             :       
    1131             :       /* Polarizations/correlations */
    1132           0 :       corrmask = RFDataMapper::corrMask(chunk.visIter());
    1133           0 :       casacore::Vector<casacore::Int> corrlist(num(POLZN));
    1134           0 :       for(casacore::uInt corr=0; corr<num(POLZN); corr++)
    1135           0 :         corrlist[corr] = (casacore::Int) ( (corrmask >> corr) & 1 );
    1136             :       
    1137             :       //      cout << "--> Flagged " << 100 * runningflag/runningcount << " % on " << Expr << ". Applying to correlations : " << corrlist << endl;
    1138           0 :       os << "TFCROP : Flagged " << 100 * runningflag/runningcount << " % on " << Expr << ". Applying to corrs : " << corrlist;
    1139           0 :       if(DryRun) os << " (Not writing flags to MS)" << casacore::LogIO::POST;
    1140           0 :       else os << " (Writing flags to MS)" << casacore::LogIO::POST;
    1141           0 :     }
    1142           0 :   RFAFlagCubeBase::endChunk();
    1143             :   ///  (chunk.visIter()).setRowBlocking(0); //reset to default
    1144             :   //            cout << " End of endChunk !!" << endl;
    1145           0 : }
    1146             : 
    1147             : 
    1148             : /* Destructor for RFATimeFreqCrop */
    1149             : 
    1150             : 
    1151           0 : RFATimeFreqCrop :: ~RFATimeFreqCrop () 
    1152             : {
    1153             :   //cout << "destructor for RFATimeFreqCrop" << endl;
    1154           0 : }
    1155             : 
    1156             : 
    1157             : 
    1158             : 
    1159             : /* Calculate the MEAN of 'vect' ignoring values flagged in 'flag' */
    1160           0 : casacore::Float RFATimeFreqCrop :: UMean(casacore::Vector<casacore::Float> vect, casacore::Vector<casacore::Bool> flag)
    1161             : {
    1162           0 :   casacore::Float mean=0;
    1163           0 :   int cnt=0;
    1164           0 :   for(int i=0;i<(int)vect.nelements();i++)
    1165           0 :     if(flag[i]==false)
    1166             :       {
    1167           0 :         mean += vect[i];
    1168           0 :         cnt++;
    1169             :       }
    1170           0 :   if(cnt==0) cnt=1;
    1171           0 :   return mean/cnt;
    1172             : }
    1173             : 
    1174             : 
    1175             : /* Calculate the STANDARD DEVN. of 'vect' w.r.to a given 'fit' 
    1176             :  * ignoring values flagged in 'flag' */
    1177           0 : casacore::Float RFATimeFreqCrop :: UStd(casacore::Vector<casacore::Float> vect, casacore::Vector<casacore::Bool> flag, casacore::Vector<casacore::Float> fit)
    1178             : {
    1179           0 :   casacore::Float std=0;
    1180           0 :   int n=0,cnt=0;
    1181           0 :   n = vect.nelements() < fit.nelements() ? vect.nelements() : fit.nelements();
    1182           0 :   for(int i=0;i<n;i++)
    1183           0 :     if(flag[i]==false)
    1184             :       {
    1185           0 :         cnt++;
    1186           0 :         std += (vect[i]-fit[i])*(vect[i]-fit[i]);
    1187             :       }
    1188           0 :   if(cnt==0) cnt=1;
    1189           0 :   return sqrt(std/cnt);
    1190             : }
    1191             : 
    1192             : 
    1193             : /* Calculate the STANDARD DEVN. of 'vect' w.r.to a given mean 
    1194             :  * ignoring values flagged in 'flag' */
    1195           0 : casacore::Float RFATimeFreqCrop :: UStd(casacore::Vector<casacore::Float> vect, casacore::Vector<casacore::Bool> flag, casacore::Float mean)
    1196             : {
    1197           0 :   casacore::Float std=0;
    1198           0 :   int cnt=0;
    1199           0 :   for(int i=0;i<(int)vect.nelements();i++)
    1200           0 :     if(flag[i]==false)
    1201             :       {
    1202           0 :         cnt++;
    1203           0 :         std += (vect[i]-mean)*(vect[i]-mean);
    1204             :       }
    1205           0 :   return sqrt(std/cnt);
    1206             : }
    1207             : 
    1208             : /* Fit Piecewise polynomials to 'data' and get the 'fit' */
    1209           0 : void RFATimeFreqCrop :: CleanBand(casacore::Vector<casacore::Float> data,casacore::Vector<casacore::Float> fit)
    1210             : {
    1211             :   //    casacore::Int step=0,ind=0;
    1212           0 :   casacore::Int deg=0; //start=0;
    1213           0 :   casacore::Int left=0,right=0;
    1214             :   //  casacore::Int le=0,ri=0;
    1215           0 :   casacore::Float sd,TOL=3;
    1216           0 :   casacore::Vector<casacore::Float> tdata;
    1217           0 :   casacore::Vector<casacore::Bool> tfband;
    1218             :   
    1219           0 :   tfband.resize(data.nelements());
    1220           0 :   tdata.resize(data.nelements());
    1221             :   
    1222           0 :   tfband = false;
    1223           0 :   tdata = data;
    1224             :   
    1225             :   /* replace empty data values by adjacent values */
    1226           0 :   for(casacore::uInt i=0;i<tdata.nelements();i++)
    1227             :     {
    1228           0 :       if(tdata[i]==0)
    1229             :         {
    1230           0 :           if(i==0)// find first non-zero value and set to that.
    1231             :             {
    1232           0 :               casacore::Int ind=0;
    1233           0 :               for(casacore::uInt j=1;j<tdata.nelements();j++)
    1234           0 :                 if(tdata[j]!=0){ind=j;break;}
    1235           0 :               if(ind==0) tdata[i]=0;
    1236           0 :               else tdata[i]=tdata[ind];
    1237             :             }
    1238             :           else// find next non-zero value and interpolate.
    1239             :             {
    1240           0 :               casacore::Int indr=0;
    1241           0 :               for(casacore::uInt j=i+1;j<tdata.nelements();j++)
    1242           0 :                 if(tdata[j]!=0){indr=j;break;}
    1243           0 :               casacore::Int indl=-1;
    1244           0 :               for(int j = i ; j >= 0 ; j--)
    1245           0 :                 if(tdata[j]!=0){indl=j;break;}
    1246             :               
    1247           0 :               if(indl==-1 && indr==0) tdata[i]=0;
    1248           0 :               if(indl>-1 && indr==0) tdata[i]=tdata[indl];
    1249           0 :               if(indl==-1 && indr>0) tdata[i]=tdata[indr];
    1250           0 :               if(indl>-1 && indr>0) tdata[i]=(tdata[indl]+tdata[indr])/2.0;
    1251             :             }
    1252             :         }
    1253             :     }
    1254             :   
    1255             :   
    1256             :   /* If there still are empty points (entire spectrum is flagged) flag it. */
    1257           0 :   for(casacore::uInt i=0;i<tdata.nelements();i++)
    1258           0 :     if(tdata[i]==0) 
    1259             :       {
    1260             :         //cout << "chan " << i << " is blank" << endl;
    1261           0 :         tfband[i]=true;
    1262             :       }
    1263             :   
    1264           0 :   fit = tdata;
    1265             :   
    1266           0 :   casacore::Int psize=1;
    1267           0 :   casacore::Int leftover=1,leftover_front=0,npieces=1;
    1268             :   
    1269           0 :   deg=1;
    1270           0 :   npieces=1;
    1271             :   
    1272           0 :   for(casacore::uInt j=0;j<=4;j++)
    1273             :     {
    1274             :       //     if(j==0) {deg = 1;npieces=1;}
    1275             :       //     if(j==1) {deg = 1;npieces=5;}
    1276             :       //     if(j==2) {deg = 2;npieces=6;}
    1277             :       //     if(j==3) {deg = 3;npieces=7;}
    1278             :       //     if(j==4) {deg = 3;npieces=8;}
    1279             :       
    1280           0 :       npieces = MIN(2*j+1, MaxNPieces);
    1281           0 :       if(j>1) {deg=2;}
    1282           0 :       if(j>2) {deg=3;}
    1283             :       
    1284           0 :       psize = (int)(tdata.nelements()/npieces);
    1285             :       //     cout << "Iter : " << j << " with Deg : " << deg << " and Piece-size : " << psize << endl;
    1286             :       
    1287           0 :       leftover = (int)(tdata.nelements() % npieces);
    1288             :       
    1289           0 :       leftover_front = (int)(leftover/2.0);
    1290             :       
    1291           0 :       left=0; right=tdata.nelements()-1;
    1292           0 :       for(casacore::Int p=0;p<npieces;p++)
    1293             :         {
    1294           0 :           if(npieces>1)
    1295             :             {
    1296           0 :               left = leftover_front + p*psize;
    1297           0 :               right = left + psize; 
    1298             :               
    1299           0 :               if(p==0) {left = 0; right = leftover_front + psize;}
    1300           0 :               if(p==npieces-1) {right = tdata.nelements()-1;} 
    1301             :             }
    1302           0 :           if(deg==1) 
    1303           0 :             LineFit(tdata,tfband,fit,left,right);
    1304             :           else 
    1305           0 :             PolyFit(tdata,tfband,fit,left,right,deg);
    1306             :         }
    1307             :       
    1308             :       /* Now, smooth the fit - make this nicer later */
    1309             :       
    1310           0 :       int winstart=0, winend=0;
    1311           0 :       float winsum=0.0;
    1312           0 :       int offset=2;
    1313           0 :       for(casacore::uInt i=offset;i<tdata.nelements()-offset;i++)
    1314             :         {
    1315           0 :           winstart = i-offset;
    1316           0 :           winend = i+offset;
    1317           0 :           if(winstart<0)winstart=0;
    1318           0 :           if(static_cast<casacore::uInt>(winend)>=tdata.nelements()) winend=tdata.nelements()-1;
    1319           0 :           if(winend <= winstart) break;
    1320           0 :           winsum=0.0;
    1321           0 :           for(casacore::uInt wi=winstart;wi<=static_cast<casacore::uInt>(winend);++wi)
    1322           0 :             winsum += fit[wi];
    1323           0 :           fit[i] = winsum/(winend-winstart+1);
    1324             :         }
    1325             :       
    1326             :       
    1327             :       /* Calculate the STD of the fit */
    1328           0 :       sd = UStd(tdata,tfband,fit);
    1329           0 :       if(j>=2)  TOL=2;
    1330           0 :       else TOL=3;
    1331             :       
    1332             :       /* Display the Fit and the data */
    1333             : #ifdef UPLOT 
    1334             :       Plot_ds9(data.nelements(),data,fit1);      
    1335             : #endif
    1336             :       
    1337             :       /* Detect outliers */
    1338           0 :       for(casacore::uInt i=0;i<tdata.nelements();i++)
    1339             :         {
    1340           0 :           if(tdata[i]-fit[i] > TOL*sd) 
    1341           0 :             tfband[i]=true;
    1342             :         }
    1343             :       
    1344             :     } // for j
    1345             :   
    1346           0 : } // end of CleanBand
    1347             : 
    1348             : 
    1349             : 
    1350             :   /* Fit a polynomial to 'data' from lim1 to lim2, of given degree 'deg', 
    1351             :    * taking care of flags in 'flag', and returning the fitted values in 'fit' */
    1352           0 : void RFATimeFreqCrop :: PolyFit(casacore::Vector<casacore::Float> data,casacore::Vector<casacore::Bool> flag, casacore::Vector<casacore::Float> fit, casacore::uInt lim1, casacore::uInt lim2,casacore::uInt deg)
    1353             : {
    1354           0 :   static casacore::Vector<casacore::Double> x;
    1355           0 :   static casacore::Vector<casacore::Double> y;
    1356           0 :   static casacore::Vector<casacore::Double> sig;
    1357           0 :   static casacore::Vector<casacore::Double> solution;
    1358             :   
    1359           0 :   casacore::uInt cnt=0;
    1360           0 :   for(casacore::uInt i=lim1;i<=lim2;i++)
    1361           0 :     if(flag[i]==false) cnt++;
    1362             :   
    1363           0 :   if(cnt <= deg)
    1364             :     {
    1365           0 :       LineFit(data,flag,fit,lim1,lim2);
    1366           0 :       return;
    1367             :     }
    1368             :   
    1369             :   
    1370           0 :   casacore::LinearFit<casacore::Double> fitter;
    1371           0 :   casacore::Polynomial<casacore::AutoDiff<casacore::Double> > combination(deg);
    1372             :   
    1373             :   
    1374           0 :   combination.setCoefficient(0,0.0);
    1375           0 :   if (deg >= 1) combination.setCoefficient(1, 0.0);
    1376           0 :   if (deg >= 2) combination.setCoefficient(2, 0.0);
    1377           0 :   if (deg >= 3) combination.setCoefficient(3, 0.0);
    1378           0 :   if (deg >= 4) combination.setCoefficient(4, 0.0);
    1379             :   
    1380           0 :   x.resize(lim2-lim1+1);
    1381           0 :   y.resize(lim2-lim1+1);
    1382           0 :   sig.resize(lim2-lim1+1);
    1383           0 :   solution.resize(deg+1);
    1384             :   
    1385           0 :   for(casacore::uInt i=lim1;i<=lim2;i++)
    1386             :     {
    1387           0 :       x[i-lim1] = i+1;
    1388           0 :       y[i-lim1] = data[i];
    1389           0 :       sig[i-lim1] = (flag[i]==true)?0:1;
    1390             :     }
    1391             :   
    1392           0 :   fitter.asWeight(true);
    1393             :   
    1394           0 :   fitter.setFunction(combination);
    1395           0 :   solution = fitter.fit(x,y,sig);
    1396             :   
    1397           0 :   for(casacore::uInt i=lim1;i<=lim2;i++)
    1398             :     {
    1399           0 :       fit[i]=0;
    1400           0 :       for(casacore::uInt j=0;j<deg+1;j++)
    1401           0 :         fit[i] += solution[j]*pow((double)(x[i-lim1]),(double)j);
    1402             :     }
    1403             :   
    1404           0 : }
    1405             : 
    1406             : 
    1407             : 
    1408             : /* Fit a LINE to 'data' from lim1 to lim2, taking care of flags in 
    1409             :  * 'flag', and returning the fitted values in 'fit' */
    1410           0 : void RFATimeFreqCrop :: LineFit(casacore::Vector<casacore::Float> data, casacore::Vector<casacore::Bool> flag, casacore::Vector<casacore::Float> fit, casacore::uInt lim1, casacore::uInt lim2)
    1411             : {
    1412           0 :   float Sx = 0, Sy = 0, Sxx = 0, Sxy = 0, S = 0, a, b, sd, mn;
    1413             :   
    1414           0 :   mn = UMean(data, flag);
    1415           0 :   sd = UStd (data, flag, mn);
    1416             :   
    1417           0 :   for (casacore::uInt i = lim1; i <= lim2; i++)
    1418             :     {
    1419           0 :       if (flag[i] == false) // if unflagged
    1420             :         {
    1421           0 :           S += 1 / (sd * sd);
    1422           0 :           Sx += i / (sd * sd);
    1423           0 :           Sy += data[i] / (sd * sd);
    1424           0 :           Sxx += (i * i) / (sd * sd);
    1425           0 :           Sxy += (i * data[i]) / (sd * sd);
    1426             :         }
    1427             :     }
    1428           0 :   a = (Sxx * Sy - Sx * Sxy) / (S * Sxx - Sx * Sx);
    1429           0 :   b = (S * Sxy - Sx * Sy) / (S * Sxx - Sx * Sx);
    1430             :   
    1431           0 :   for (casacore::uInt i = lim1; i <= lim2; i++)
    1432           0 :     fit[i] = a + b * i;
    1433             :   
    1434           0 : }
    1435             : 
    1436             : /* Return antenna numbers from baseline number - upper triangle storage */
    1437           0 : void RFATimeFreqCrop :: Ants(casacore::uInt bs, casacore::uInt *a1, casacore::uInt *a2)
    1438             : {
    1439           0 :   casacore::uInt sum=0,cnt=0;
    1440           0 :   for(casacore::uInt i=(NumAnt);i>1;i--)
    1441             :     {
    1442           0 :       sum += i;
    1443           0 :       if(sum<=bs) cnt++;
    1444           0 :       else break;
    1445             :     }
    1446           0 :   *a1 = cnt;
    1447             :   
    1448           0 :   sum = (NumAnt)*((NumAnt)+1)/2 - ((NumAnt)-(*a1))*((NumAnt)-(*a1)+1)/2; 
    1449             :   
    1450           0 :   *a2 = bs - sum + (*a1);
    1451           0 : }
    1452             : 
    1453             : /* Return baseline index from a pair of antenna numbers - upper triangle storage */
    1454           0 : casacore::uInt RFATimeFreqCrop :: BaselineIndex(casacore::uInt /*row*/, casacore::uInt a1, casacore::uInt a2)
    1455             : {
    1456           0 :   return ( (NumAnt)*((NumAnt)+1)/2 - ((NumAnt)-a1)*((NumAnt)-a1+1)/2 + (a2 - a1) );
    1457             : }
    1458             : 
    1459             : 
    1460             : 
    1461             : /* Display a 2D data set on DS9 in gray scale */
    1462           0 : void RFATimeFreqCrop :: Display_ds9(casacore::Int xdim, casacore::Int ydim, casacore::Matrix<casacore::Float> &data, casacore::Int frame)
    1463             : {
    1464             :   
    1465           0 :   FILE *SAOout = NULL;
    1466             :   char tmp[100];
    1467           0 :   char server[100] = "ds9";   
    1468           0 :   int bitpix = -32;
    1469           0 :   char xpa[100] = "";
    1470             :   
    1471           0 :   strcpy (xpa, "xpaset");
    1472             :   
    1473           0 :   sprintf (tmp, "%s %s \"array [xdim=%d,ydim=%d,bitpix=%d]\"\n",
    1474             :            xpa, server, xdim, ydim, bitpix);
    1475           0 :   SAOout = (FILE *) popen (tmp, "w");
    1476             :   
    1477           0 :   if (frame > 0)
    1478             :     {
    1479           0 :       sprintf (tmp, "echo \"frame %d \" | %s %s \n", frame, xpa, server);
    1480           0 :       system (tmp);
    1481             :     }
    1482             :   
    1483           0 :   if (SAOout != NULL)
    1484             :     {
    1485             :       //      for (i = 0; i < ydim; i++)
    1486             :       //        fwrite (data[i], sizeof (float) * xdim, 1, SAOout);
    1487           0 :       casacore::Bool deleteit=false;
    1488           0 :       casacore::Float *dataptr = data.getStorage(deleteit);
    1489           0 :       fwrite(dataptr, sizeof(casacore::Float)*xdim*ydim, 1, SAOout);
    1490           0 :       pclose (SAOout);
    1491             :       //if(deleteit) data.freeStorage(dataptr,true);
    1492             :     }
    1493             :   else
    1494             :     {
    1495           0 :       perror ("Error in opening SAO - ds9 \n");
    1496             :     }
    1497             :   
    1498           0 :   if (frame > 0)
    1499             :     {
    1500           0 :       system ("xpaset -p ds9 zoom to fit");
    1501             :     }
    1502             :   
    1503             :   //cout << " Press enter to continue... " << endl;
    1504             :   //getchar();
    1505             :   
    1506             :   
    1507           0 : }
    1508             : 
    1509             : /* Display a line plot in DS9 !!! */
    1510           0 : void RFATimeFreqCrop :: Plot_ds9(casacore::Int dim, casacore::Vector<casacore::Float> data1, casacore::Vector<casacore::Float> data2)
    1511             : {
    1512             :   
    1513             :   //  FILE *SAOout = NULL;
    1514             :   //char tmp[100];
    1515             :   //char server[100] = "ds9"; 
    1516             :   //int bitpix = -32;
    1517             :   int i;
    1518           0 :   char xpa[100] = "";
    1519             :   
    1520             :   //static casacore::Bool firstentry=true;
    1521           0 :   strcpy (xpa, "xpaset");
    1522             :   
    1523           0 :   casacore::String cmd("");
    1524             :   
    1525             :   {
    1526           0 :     cmd = "xpaset -p ds9 plot flagger clear \n";
    1527           0 :     system(cmd.data());
    1528             :     //        SAOout = (FILE *) popen (tmp, "w");
    1529             :   }
    1530             :   
    1531             :   
    1532           0 :   cmd = "echo '";
    1533           0 :   for(i=0;i<dim;i++)
    1534             :     {
    1535           0 :       cmd +=  casacore::String::toString(i) + " " + casacore::String::toString(data2[i]) + " " ;
    1536             :     }
    1537           0 :   cmd += "\n' | xpaset ds9 plot flagger data xy\n";
    1538           0 :   cmd += "xpaset -p ds9 plot flagger color linear blue\n";
    1539           0 :   cmd += "xpaset -p ds9 plot flagger line linear width 2.0\n";
    1540           0 :   system(cmd.data());
    1541             :   
    1542           0 :   cmd = "echo '";
    1543           0 :   for(i=0;i<dim;i++)
    1544             :     {
    1545           0 :       cmd +=  casacore::String::toString(i) + " " + casacore::String::toString(data1[i]) + " " ;
    1546             :     }
    1547           0 :   cmd += "\n' | xpaset ds9 plot flagger data xy\n";
    1548           0 :   cmd += "xpaset -p ds9 plot flagger color linear red\n";
    1549           0 :   cmd += "xpaset -p ds9 plot flagger line linear width 2.0\n";
    1550           0 :   system(cmd.data());
    1551             :   
    1552           0 : }// end of plot_ds9
    1553             : 
    1554             : 
    1555             : } //# NAMESPACE CASA - END
    1556             : 

Generated by: LCOV version 1.16