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

          Line data    Source code
       1             : //# RFCubeLattice.cc: this defines RFCubeLattice
       2             : //# Copyright (C) 2000,2001
       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             : #include <casacore/lattices/Lattices/LatticeStepper.h>
      28             : #include <flagging/Flagging/RFFloatLattice.h>
      29             : #include <flagging/Flagging/RFCommon.h>
      30             : 
      31             : using namespace casacore;
      32             : namespace casa { //# NAMESPACE CASA - BEGIN
      33             : 
      34           0 : RFFloatLatticeIterator::RFFloatLatticeIterator ()
      35           0 :   : n_chan(0), n_ifr(0), /* n_time(0),*/ n_bit(0), n_corr(0)
      36             : {
      37           0 :   iter_pos = 0;
      38           0 :   curs = Matrix<Float>();
      39           0 :   lattice = NULL;
      40           0 : }
      41             : 
      42           0 :  RFFloatLatticeIterator::RFFloatLatticeIterator(std::vector<std::vector<bool> > *lat,
      43             :                                                                    unsigned nchan, unsigned nifr, 
      44             :                                                                    unsigned /* ntime */, unsigned nbit,
      45           0 :                                                                    unsigned ncorr)
      46           0 :    : n_chan(nchan), n_ifr(nifr), /* n_time(ntime),*/ n_bit(nbit), n_corr(ncorr)
      47             : 
      48             : {
      49           0 :   iter_pos = 0;
      50           0 :   lattice = lat;
      51           0 :   update_curs();
      52           0 : }
      53             : 
      54           0 : RFFloatLatticeIterator::~RFFloatLatticeIterator()
      55             : {
      56           0 :   flush_curs();
      57           0 : }
      58             : 
      59             : /* Update cursor from buffer, convert from bitset to Matrix<uInt> */
      60             : 
      61             : /*
      62             :     The format is like this:
      63             : 
      64             :     [ ... | agent1 | agent0 | corrN | ... | corr1 | corr0 ]
      65             : 
      66             :     i.e. the length is number of agents + number of correlations.
      67             : 
      68             :     Except (don't ask why) if nCorr = 1, the format is
      69             : 
      70             :     [ ... | agent1 | agent0 | notUsed | corr0 ]
      71             : 
      72             : */
      73             : 
      74           0 : void RFFloatLatticeIterator::update_curs()
      75             : {
      76           0 :   if (lattice != NULL && iter_pos < lattice->size()) {
      77           0 :     curs.resize(IPosition(2, n_chan, n_ifr));
      78             : 
      79             :     //curs = (*lattice)[iter_pos];
      80             : 
      81           0 :     std::vector<bool> &l = (*lattice)[iter_pos];
      82             : 
      83           0 :     std::vector<bool> val(n_bit);
      84           0 :     if (n_corr == 1) {
      85           0 :       val.resize(n_bit+1);
      86             :     }
      87             : 
      88           0 :     for (unsigned ifr = 0; ifr < n_ifr; ifr++) {
      89           0 :       for (unsigned chan = 0; chan < n_chan; chan++) {
      90           0 :         if (n_corr <= 1) {
      91             :           /* write corr0 */
      92           0 :           unsigned indx = 0 + n_bit*(chan + n_chan*ifr);
      93           0 :           val[0] = l[indx];
      94             : 
      95             :           /* write agents starting from b[2] */
      96           0 :           for (unsigned b = 1; b < n_bit; b++) {
      97           0 :             indx = b + n_bit*(chan + n_chan*ifr);
      98           0 :             val[b+1] = l[indx];
      99             :           }
     100             :         }
     101             :         else {
     102             :           unsigned indx;
     103           0 :           for (unsigned b = 0; b < n_bit; b++) {
     104           0 :             indx = b + n_bit*(chan + n_chan*ifr);
     105             :             
     106           0 :             val[b] = l[indx]; 
     107             :           }
     108             :         }
     109             : 
     110           0 :         curs(chan, ifr) = bitvec_to_ulong(val);
     111             :       }
     112             :     }
     113           0 :   }
     114           0 : }
     115             : 
     116             : /* Write cursor back to buffer, convert from Matrix<uInt> to bitset.
     117             :    See above for an explanation of the format.
     118             : */
     119           0 : void RFFloatLatticeIterator::flush_curs()
     120             : {
     121           0 :   if (lattice != NULL && iter_pos < lattice->size()) {
     122             : 
     123             :     //(*lattice)[iter_pos] = curs;
     124           0 :     std::vector<bool> &l = (*lattice)[iter_pos];
     125             :     
     126           0 :     std::vector<bool> val(n_bit+1);
     127             : 
     128           0 :     for (unsigned ifr = 0; ifr < n_ifr; ifr++) {
     129           0 :       for (unsigned chan = 0; chan < n_chan; chan++) {
     130             : 
     131           0 :         unsigned c = (unsigned) curs(chan, ifr);
     132           0 :         for (unsigned i = 0; i < n_bit+1; i++) {
     133           0 :           val[i] = (c & 1);
     134           0 :           c = c >> 1;
     135             :         }
     136             : 
     137           0 :         if (n_corr <= 1) {
     138           0 :           unsigned indx = 0 + n_bit*(chan + n_chan*ifr);
     139           0 :           l[indx] = val[0];
     140             : 
     141           0 :           for (unsigned b = 1; b < n_bit; b++) {
     142           0 :             indx = b + n_bit*(chan + n_chan*ifr);
     143           0 :             l[indx] = val[b+1];
     144             :           }
     145             :         }
     146             :         else {
     147             :           unsigned indx;
     148           0 :           for (unsigned b = 0; b < n_bit; b++) {
     149           0 :             indx = b + n_bit*(chan + n_chan*ifr);
     150             :             
     151           0 :             l[indx] = val[b];
     152             :           }
     153             :         }
     154             :       }
     155             :     }
     156           0 :   }
     157           0 : }
     158             : 
     159           0 : Matrix<Float> * RFFloatLatticeIterator::reset()
     160             : {
     161           0 :   if (iter_pos != 0) flush_curs();
     162           0 :   iter_pos = 0;
     163           0 :   update_curs();
     164           0 :   return cursor();
     165             : }
     166             : 
     167           0 : Matrix<Float> * RFFloatLatticeIterator::advance(uInt t1)
     168             : {
     169           0 :   if (iter_pos != t1) flush_curs();
     170           0 :   iter_pos = t1;
     171           0 :   update_curs();
     172           0 :   return cursor();
     173             : }
     174             : 
     175           0 : Matrix<Float> * RFFloatLatticeIterator::cursor()
     176             : {
     177           0 :   return &curs;
     178             :   //return &((*lattice)[iter_pos]);
     179             : }
     180             : 
     181           0 : Float & RFFloatLatticeIterator::operator()(uInt i,uInt j)
     182             : { 
     183           0 :   return curs(i, j);
     184             :   //return (*lattice)[iter_pos](i, j);
     185             : }
     186             : 
     187             : 
     188             : 
     189             : 
     190           0 : RFFloatLattice::RFFloatLattice ()
     191             : {
     192           0 : }
     193             : 
     194           0 : RFFloatLattice::RFFloatLattice ( uInt nchan,
     195             :                                  uInt nifr,
     196             :                                  uInt ntime,
     197             :                                  uInt ncorr,
     198             :                                  uInt nAgent,
     199           0 :                                  Int maxmem )
     200             : {
     201           0 :   init(nchan, nifr, ntime, ncorr, nAgent, maxmem);
     202           0 : }
     203           0 : RFFloatLattice::RFFloatLattice ( uInt nchan,
     204             :                                  uInt nifr,
     205             :                                  uInt ntime,
     206             :                                  uInt ncorr,
     207             :                                  uInt nAgent,
     208             :                                  const Float &init_val,
     209           0 :                                  Int maxmem )
     210             : {
     211           0 :     init(nchan, nifr, ntime, ncorr, nAgent, init_val, maxmem);
     212           0 : }
     213           0 : RFFloatLattice::~RFFloatLattice ()
     214             : {
     215           0 :   cleanup();
     216           0 : }
     217             : 
     218             : void 
     219           0 : RFFloatLattice::init(uInt nchan,
     220             :                      uInt nifr,
     221             :                      uInt ntime,
     222             :                      uInt ncorr,
     223             :                      uInt nAgent,
     224             :                      Int /*maxmem*/,
     225             :                      Int /*tile_mb*/)
     226             : {
     227           0 :   n_bit = ncorr + nAgent;
     228             :   
     229           0 :   if (n_bit > 32) {
     230           0 :       stringstream ss;
     231             :       ss << 
     232           0 :           "Sorry, too many polarizations (" << ncorr <<
     233           0 :           ") and agents (" << nAgent << "). Max supported number is 32 in total.";
     234           0 :       cerr << ss.str();
     235           0 :       abort();
     236             :       throw AipsError(ss.str());
     237           0 :   }
     238             :   
     239           0 :   lat_shape = IPosition(3,nchan,nifr,ntime);
     240             :   
     241           0 :   lat = std::vector<std::vector<bool> >(ntime);
     242           0 :   for (unsigned i = 0; i < ntime; i++) {
     243             :       //lat[i] = Matrix<Float>(IPosition(2, nchan, nifr));
     244           0 :       lat[i] = std::vector<bool>(nchan * nifr * (ncorr+nAgent));
     245             :   }
     246             :   
     247           0 :   iter = RFFloatLatticeIterator(&lat, nchan, nifr, ntime, ncorr+nAgent, ncorr);
     248           0 : }
     249             : 
     250           0 : RFFloatLatticeIterator RFFloatLattice::newIter()
     251             : {
     252           0 :   return RFFloatLatticeIterator(&lat, n_chan, n_ifr, n_time, n_bit, n_corr);
     253             : }
     254             : 
     255           0 : void RFFloatLattice::init(uInt nchan,
     256             :                                             uInt nifr,
     257             :                                             uInt ntime,
     258             :                                             uInt ncorr,
     259             :                                             uInt nAgent,
     260             :                                             const Float &init_val,
     261             :                                             Int maxmem,
     262             :                                             Int tile_mb)
     263             : {
     264           0 :   n_chan = nchan;
     265           0 :   n_ifr = nifr;
     266           0 :   n_time = ntime;
     267           0 :   n_bit = ncorr + nAgent;
     268           0 :   n_corr = ncorr;
     269           0 :   init(nchan, nifr, ntime, ncorr, nAgent, maxmem, tile_mb);
     270             :   //  lat.set(init_val);
     271             : 
     272           0 :   uInt nbits = ncorr + nAgent;
     273             : 
     274             :   /* Write init_val to every matrix element.
     275             :      See above for description of format */
     276           0 :   std::vector<bool> val = bitvec_from_ulong(reinterpret_cast<const unsigned &>(init_val),nbits+1);
     277           0 :   for (unsigned i = 0; i < ntime; i++) {
     278           0 :     for (unsigned chan = 0; chan < nchan; chan++) {
     279           0 :       for (unsigned ifr = 0; ifr < nifr; ifr++) {
     280           0 :         if (n_corr <= 1) {
     281           0 :           unsigned indx = 0 + n_bit*(chan + n_chan*ifr);
     282           0 :           lat[i][indx] = val[0];
     283             : 
     284           0 :           for (unsigned b = 1; b < n_bit; b++) {
     285           0 :             indx = b + n_bit*(chan + n_chan*ifr);
     286           0 :             lat[i][indx] = val[b+1];
     287             :           }
     288             :         }
     289             :         else {
     290             :           unsigned indx;
     291           0 :           for (unsigned b = 0; b < n_bit; b++) {
     292           0 :             indx = b + n_bit*(chan + n_chan*ifr);
     293             :             
     294           0 :             lat[i][indx] = val[b];
     295             :           }
     296             :         }
     297             :       }
     298             :     }
     299             :   }
     300           0 : }
     301             : 
     302           0 : void RFFloatLattice::cleanup ()
     303             : {
     304           0 :   iter.flush_curs();
     305           0 :   iter.cursor()->resize(IPosition(2, 0, 0));
     306           0 :   iter = RFFloatLatticeIterator();
     307           0 :   lat.resize(0);
     308           0 :   lat_shape.resize(0);
     309           0 : }
     310             : 
     311           0 : Matrix<Float> * RFFloatLattice::reset ( Bool /*r*/,Bool /*w*/ )
     312             : {
     313           0 :   return iter.reset();
     314             : }
     315             : 
     316             : 
     317             : } //# NAMESPACE CASA - END
     318             : 

Generated by: LCOV version 1.16