From eee36411e0b943fb76198e802e0881ffab2ee72b Mon Sep 17 00:00:00 2001
From: Jonathan Hanks <jonathan.hanks@ligo.org>
Date: Thu, 10 Oct 2019 13:21:32 -0700
Subject: [PATCH] Extending the testing of daqd with 16bit ints.

---
 src/fe_stream_test/fe_multi_stream_test.cc |  23 +-
 src/fe_stream_test/fe_stream_check_nds.cc  |  34 +-
 src/fe_stream_test/fe_stream_generator.hh  | 394 +++++++++++++--------
 3 files changed, 303 insertions(+), 148 deletions(-)

diff --git a/src/fe_stream_test/fe_multi_stream_test.cc b/src/fe_stream_test/fe_multi_stream_test.cc
index 7b4a98fea..b08056a64 100644
--- a/src/fe_stream_test/fe_multi_stream_test.cc
+++ b/src/fe_stream_test/fe_multi_stream_test.cc
@@ -240,12 +240,20 @@ public:
         size_t mid_channel_num =
             mid_data_bytes / ( sizeof( float ) * mid_rate );
         size_t slow_channel_num = slow_data_bytes / ( sizeof( float ) * 16 );
-        size_t channel_num = fast_channel_num + slow_channel_num;
+        size_t slow_16i_channel_num = 0;
+        if ( slow_channel_num > 2 )
+        {
+            slow_channel_num -= 1;
+            slow_16i_channel_num = 2;
+        }
+        size_t channel_num = fast_channel_num + mid_channel_num +
+            slow_channel_num + slow_16i_channel_num;
 
         generators_.reserve( channel_num );
         tp_generators_.reserve( tp_table_.size( ) );
 
         size_t mid_channel_boundary = fast_channel_num + mid_channel_num;
+        size_t slow_channel_boundary = mid_channel_boundary + slow_channel_num;
 
         ChNumDb chDb;
         ChNumDb tpDb;
@@ -272,7 +280,7 @@ public:
                     SimChannel( ss.str( ), 2, mid_rate, chnum ),
                     ( i + dcu_id_ ) % 21 ) ) );
         }
-        for ( size_t i = mid_channel_boundary; i < channel_num; ++i )
+        for ( size_t i = mid_channel_boundary; i < slow_channel_boundary; ++i )
         {
             int chnum = chDb.next( 4 );
 
@@ -283,6 +291,17 @@ public:
                     SimChannel( ss.str( ), 2, 16, chnum ),
                     ( i + dcu_id_ ) % 21 ) ) );
         }
+        for ( size_t i = slow_channel_boundary; i < channel_num; ++i )
+        {
+            int chnum = chDb.next( 4 );
+
+            std::ostringstream ss;
+            ss << name_ << "-" << i;
+            generators_.push_back(
+                GeneratorPtr( new Generators::GPSMod30kSecWithOffset< short >(
+                    SimChannel( ss.str( ), 1, 16, chnum ),
+                    ( i + dcu_id_ ) % 21 ) ) );
+        }
 
         for ( size_t i = 0; i < tp_table_.size( ); ++i )
         {
diff --git a/src/fe_stream_test/fe_stream_check_nds.cc b/src/fe_stream_test/fe_stream_check_nds.cc
index 38ebf2929..dc1db413d 100644
--- a/src/fe_stream_test/fe_stream_check_nds.cc
+++ b/src/fe_stream_test/fe_stream_check_nds.cc
@@ -132,6 +132,28 @@ get_nds_channels( Config& cfg )
         NDS::channel_predicate( "*", NDS::channel::CHANNEL_TYPE_ONLINE ) );
 }
 
+bool
+is_16bit_int_channel( const NDS::channel& ch )
+{
+    return ch.DataType( ) == NDS::channel::DATA_TYPE_INT16;
+}
+
+void
+add_16bit_int_channel( const NDS::channels_type& channels,
+                       std::vector< int >&       indexes )
+{
+    for ( int i = 0; i < channels.size( ); ++i )
+    {
+        if ( is_16bit_int_channel( channels[ i ] ) &&
+             std::find( indexes.begin( ), indexes.end( ), i ) ==
+                 indexes.end( ) )
+        {
+            indexes.push_back( i );
+            break;
+        }
+    }
+}
+
 std::vector< GeneratorPtr >
 load_generators( Config& cfg )
 {
@@ -147,7 +169,13 @@ load_generators( Config& cfg )
                   << cfg.seed << "\n";
         std::vector< int > indexes{};
         indexes.reserve( cfg.random_channels );
-        for ( int i = 0; i < cfg.random_channels; ++i )
+        add_16bit_int_channel( channels, indexes );
+        add_16bit_int_channel( channels, indexes );
+        for ( int i = 0; i < indexes.size( ); ++i )
+        {
+            cfg.channels.push_back( channels[ indexes[ i ] ].Name( ) );
+        }
+        for ( int i = indexes.size( ); i < cfg.random_channels; ++i )
         {
             int index = 0;
             do
@@ -195,6 +223,10 @@ main( int argc, char* argv[] )
     std::vector< std::shared_ptr< NDS::buffers_type > > data_from_nds;
     NDS::parameters                                     params(
         cfg.hostname, cfg.port, NDS::connection::PROTOCOL_ONE );
+
+    std::cout << "Requesting data from " << cfg.gps << " to " << cfg.gps + 1
+              << "\n";
+
     auto stream = NDS::iterate(
         params, NDS::request_period( cfg.gps, cfg.gps + 1 ), cfg.channels );
     for ( const auto& bufs : stream )
diff --git a/src/fe_stream_test/fe_stream_generator.hh b/src/fe_stream_test/fe_stream_generator.hh
index 4a5b29bed..d08b81fa3 100644
--- a/src/fe_stream_test/fe_stream_generator.hh
+++ b/src/fe_stream_test/fe_stream_generator.hh
@@ -21,21 +21,32 @@ class SimChannel
 {
 private:
     std::string name_;
-    int chtype_;
-    int rate_;
-    int chnum_;
-    int dcuid_;
+    int         chtype_;
+    int         rate_;
+    int         chnum_;
+    int         dcuid_;
+
 public:
-    SimChannel(): name_(""), chtype_(0), rate_(0), chnum_(0), dcuid_(0) {}
-    SimChannel(std::string name, int chtype, int rate, int chnum, int dcuid=0):
-            name_(name), chtype_(chtype), rate_(rate), chnum_(chnum), dcuid_(dcuid) {}
-    SimChannel(const SimChannel& other):
-            name_(other.name_), chtype_(other.chtype_), rate_(other.rate_),
-            chnum_(other.chnum_), dcuid_(other.dcuid_) {}
-
-    SimChannel& operator=(const SimChannel& other)
+    SimChannel( )
+        : name_( "" ), chtype_( 0 ), rate_( 0 ), chnum_( 0 ), dcuid_( 0 )
+    {
+    }
+    SimChannel(
+        std::string name, int chtype, int rate, int chnum, int dcuid = 0 )
+        : name_( name ), chtype_( chtype ), rate_( rate ), chnum_( chnum ),
+          dcuid_( dcuid )
+    {
+    }
+    SimChannel( const SimChannel& other )
+        : name_( other.name_ ), chtype_( other.chtype_ ), rate_( other.rate_ ),
+          chnum_( other.chnum_ ), dcuid_( other.dcuid_ )
+    {
+    }
+
+    SimChannel&
+    operator=( const SimChannel& other )
     {
-        if (this != &other)
+        if ( this != &other )
         {
             name_ = other.name_;
             chtype_ = other.chtype_;
@@ -46,256 +57,349 @@ public:
         return *this;
     }
 
-    int data_type() const { return chtype_; }
-    int data_rate() const { return rate_; }
-    int channel_num() const { return chnum_; }
-    int dcuid() const { return dcuid_; }
+    int
+    data_type( ) const
+    {
+        return chtype_;
+    }
+    int
+    data_rate( ) const
+    {
+        return rate_;
+    }
+    int
+    channel_num( ) const
+    {
+        return chnum_;
+    }
+    int
+    dcuid( ) const
+    {
+        return dcuid_;
+    }
 
-    const std::string& name() const { return name_; }
+    const std::string&
+    name( ) const
+    {
+        return name_;
+    }
 };
 
 class Generator
 {
 protected:
-    virtual const std::string& channel_base_name() const = 0;
+    virtual const std::string& channel_base_name( ) const = 0;
+
+    virtual std::string
+    other_params( ) const
+    {
+        return "";
+    }
 
-    virtual std::string other_params() const { return ""; }
 public:
-    virtual std::string generator_name() const = 0;
-    virtual std::string full_channel_name() const
+    virtual std::string generator_name( ) const = 0;
+    virtual std::string
+    full_channel_name( ) const
     {
         std::ostringstream os;
-        os << channel_base_name() << "--" << generator_name() << other_params() << "--" << data_type() << "--" << data_rate();
-        return os.str();
+        os << channel_base_name( ) << "--" << generator_name( )
+           << other_params( ) << "--" << data_type( ) << "--" << data_rate( );
+        return os.str( );
     }
 
-    virtual size_t bytes_per_sec() const = 0;
+    virtual size_t bytes_per_sec( ) const = 0;
 
-    virtual char* generate(int gps_sec, int gps_nano, char *out) = 0;
+    virtual char* generate( int gps_sec, int gps_nano, char* out ) = 0;
 
-    virtual void output_ini_entry(std::ostream& os) = 0;
-    virtual void output_par_entry(std::ostream& os) = 0;
+    virtual void output_ini_entry( std::ostream& os ) = 0;
+    virtual void output_par_entry( std::ostream& os ) = 0;
 
-    virtual int data_type() const = 0;
-    virtual int data_rate() const = 0;
+    virtual int data_type( ) const = 0;
+    virtual int data_rate( ) const = 0;
 };
 
-typedef std::tr1::shared_ptr<Generator> GeneratorPtr;
+typedef std::tr1::shared_ptr< Generator > GeneratorPtr;
 
-namespace Generators {
-    class SimChannelGenerator : public Generator {
+namespace Generators
+{
+    class SimChannelGenerator : public Generator
+    {
     protected:
         SimChannel ch_;
 
-        virtual const std::string& channel_base_name() const { return ch_.name(); };
+        virtual const std::string&
+        channel_base_name( ) const
+        {
+            return ch_.name( );
+        };
+
     public:
-        SimChannelGenerator(const SimChannel& ch):
-                ch_(ch) {}
+        SimChannelGenerator( const SimChannel& ch ) : ch_( ch )
+        {
+        }
 
-        virtual size_t bytes_per_sec() const
+        virtual size_t
+        bytes_per_sec( ) const
         {
-            if (ch_.data_type() != 2 && ch_.data_type() != 4)
-                throw std::runtime_error("Unsupported type");
-            return ch_.data_rate()*4;
+            return data_type_size( static_cast< short >( ch_.data_type( ) ) ) *
+                ch_.data_rate( );
         }
 
-        virtual void output_ini_entry(std::ostream& os)
+        virtual void
+        output_ini_entry( std::ostream& os )
         {
-            os << "[" << full_channel_name() << "]\n";
-            os << "datarate=" << data_rate() << "\n";
-            os << "datatype=" << data_type() << "\n";
-            os << "chnnum=" << ch_.channel_num() << "\n";
+            os << "[" << full_channel_name( ) << "]\n";
+            os << "datarate=" << data_rate( ) << "\n";
+            os << "datatype=" << data_type( ) << "\n";
+            os << "chnnum=" << ch_.channel_num( ) << "\n";
         }
 
-        virtual void output_par_entry(std::ostream& os)
+        virtual void
+        output_par_entry( std::ostream& os )
         {
-            if (data_rate() != 2048)
-                throw std::runtime_error("Cannot generate a par entry for a non 2k channel right now");
-            if (data_type() != 4)
-                throw std::runtime_error("Cannot generate a par entry for a non float channel");
-            os << "[" << full_channel_name() << "]\n";
+            if ( data_rate( ) != 2048 )
+                throw std::runtime_error( "Cannot generate a par entry for a "
+                                          "non 2k channel right now" );
+            if ( data_type( ) != 4 )
+                throw std::runtime_error(
+                    "Cannot generate a par entry for a non float channel" );
+            os << "[" << full_channel_name( ) << "]\n";
             os << "ifoid = 1\n";
-            os << "rmid = " << ch_.dcuid() << "\n";
+            os << "rmid = " << ch_.dcuid( ) << "\n";
             os << "dcuid = " << 16 << "\n";
-            os << "chnnum = " << ch_.channel_num() << "\n";
-            os << "datatype = " << data_type() << "\n";
-            os << "datarate = " << data_rate() << "\n";
+            os << "chnnum = " << ch_.channel_num( ) << "\n";
+            os << "datatype = " << data_type( ) << "\n";
+            os << "datarate = " << data_rate( ) << "\n";
         }
 
-        virtual int data_type() const { return ch_.data_type(); };
-        virtual int data_rate() const { return ch_.data_rate(); };
+        virtual int
+        data_type( ) const
+        {
+            return ch_.data_type( );
+        };
+        virtual int
+        data_rate( ) const
+        {
+            return ch_.data_rate( );
+        };
     };
 
-    
-    
-    class GPSSecondGenerator: public SimChannelGenerator
+    class GPSSecondGenerator : public SimChannelGenerator
     {
     public:
-        GPSSecondGenerator(const SimChannel& ch):
-                SimChannelGenerator(ch) {}
+        GPSSecondGenerator( const SimChannel& ch ) : SimChannelGenerator( ch )
+        {
+        }
 
-        std::string generator_name() const { return "gpssec"; }
+        std::string
+        generator_name( ) const
+        {
+            return "gpssec";
+        }
 
-        char* generate(int gps_sec, int gps_nano, char* out)
+        char*
+        generate( int gps_sec, int gps_nano, char* out )
         {
-            int rate = data_rate() / 16;
-            int *out_ = reinterpret_cast<int*>(out);
-            for (int i = 0; i < rate; ++i)
+            int  rate = data_rate( ) / 16;
+            int* out_ = reinterpret_cast< int* >( out );
+            for ( int i = 0; i < rate; ++i )
             {
                 *out_ = gps_sec;
                 ++out_;
             }
-            return reinterpret_cast<char*>(out_);
+            return reinterpret_cast< char* >( out_ );
         }
     };
 
-    template <typename T>
-    class GPSSecondWithOffset: public SimChannelGenerator
+    template < typename T >
+    class GPSSecondWithOffset : public SimChannelGenerator
     {
         int offset_;
+
     public:
-        GPSSecondWithOffset(const SimChannel& ch, int offset):
-                SimChannelGenerator(ch), offset_(offset) {}
+        GPSSecondWithOffset( const SimChannel& ch, int offset )
+            : SimChannelGenerator( ch ), offset_( offset )
+        {
+        }
 
-        std::string generator_name() const { return "gpssoff1p"; }
+        std::string
+        generator_name( ) const
+        {
+            return "gpssoff1p";
+        }
 
-        std::string other_params() const
+        std::string
+        other_params( ) const
         {
             std::ostringstream os;
             os << "--" << offset_;
-            return os.str();
+            return os.str( );
         }
 
-        char* generate(int gps_sec, int gps_nano, char* out)
+        char*
+        generate( int gps_sec, int gps_nano, char* out )
         {
-            int rate = data_rate() / 16;
-            T *out_ = reinterpret_cast<T*>(out);
-            for (int i = 0; i < rate; ++i)
+            int rate = data_rate( ) / 16;
+            T*  out_ = reinterpret_cast< T* >( out );
+            for ( int i = 0; i < rate; ++i )
             {
-                *out_ = static_cast<T>(gps_sec + offset_);
+                *out_ = static_cast< T >( gps_sec + offset_ );
                 ++out_;
             }
-            return reinterpret_cast<char*>(out_);
+            return reinterpret_cast< char* >( out_ );
         }
     };
 
-    template <typename T>
-    class GPSMod100kSecWithOffset: public SimChannelGenerator
+    template < typename T >
+    class GPSMod100kSecWithOffset : public SimChannelGenerator
     {
         int offset_;
+
     public:
-        GPSMod100kSecWithOffset(const SimChannel& ch, int offset):
-                SimChannelGenerator(ch), offset_(offset) {}
+        GPSMod100kSecWithOffset( const SimChannel& ch, int offset )
+            : SimChannelGenerator( ch ), offset_( offset )
+        {
+        }
 
-        std::string generator_name() const { return "gpssmd100koff1p"; }
+        std::string
+        generator_name( ) const
+        {
+            return "gpssmd100koff1p";
+        }
 
-        std::string other_params() const
+        std::string
+        other_params( ) const
         {
             std::ostringstream os;
             os << "--" << offset_;
-            return os.str();
+            return os.str( );
         }
 
-        char* generate(int gps_sec, int gps_nano, char* out)
+        char*
+        generate( int gps_sec, int gps_nano, char* out )
         {
-            int rate = data_rate() / 16;
-            T *out_ = reinterpret_cast<T*>(out);
-            for (int i = 0; i < rate; ++i)
+            int rate = data_rate( ) / 16;
+            T*  out_ = reinterpret_cast< T* >( out );
+            for ( int i = 0; i < rate; ++i )
             {
-                *out_ = static_cast<T>((gps_sec%100000) + offset_);
+                *out_ = static_cast< T >( ( gps_sec % 100000 ) + offset_ );
                 ++out_;
             }
-            return reinterpret_cast<char*>(out_);
+            return reinterpret_cast< char* >( out_ );
         }
     };
 
-    template <typename T>
-    class GPSMod30kSecWithOffset: public SimChannelGenerator
+    template < typename T >
+    class GPSMod30kSecWithOffset : public SimChannelGenerator
     {
         int offset_;
+
     public:
-        GPSMod30kSecWithOffset(const SimChannel& ch, int offset):
-                SimChannelGenerator(ch), offset_(offset) {}
+        GPSMod30kSecWithOffset( const SimChannel& ch, int offset )
+            : SimChannelGenerator( ch ), offset_( offset )
+        {
+        }
 
-        std::string generator_name() const { return "gpssmd30koff1p"; }
+        std::string
+        generator_name( ) const
+        {
+            return "gpssmd30koff1p";
+        }
 
-        std::string other_params() const
+        std::string
+        other_params( ) const
         {
             std::ostringstream os;
             os << "--" << offset_;
-            return os.str();
+            return os.str( );
         }
 
-        char* generate(int gps_sec, int gps_nano, char* out)
+        char*
+        generate( int gps_sec, int gps_nano, char* out )
         {
-            int rate = data_rate() / 16;
-            T *out_ = reinterpret_cast<T*>(out);
-            for (int i = 0; i < rate; ++i)
+            int rate = data_rate( ) / 16;
+            T*  out_ = reinterpret_cast< T* >( out );
+            for ( int i = 0; i < rate; ++i )
             {
-                *out_ = static_cast<T>((gps_sec%30000) + offset_);
+                *out_ = static_cast< T >( ( gps_sec % 30000 ) + offset_ );
                 ++out_;
             }
-            return reinterpret_cast<char*>(out_);
+            return reinterpret_cast< char* >( out_ );
         }
     };
 
-    template <typename T>
-    class StaticValue: public SimChannelGenerator
+    template < typename T >
+    class StaticValue : public SimChannelGenerator
     {
         T value_;
+
     public:
-        StaticValue(const SimChannel& ch, T value):
-                SimChannelGenerator(ch), value_(value) {}
+        StaticValue( const SimChannel& ch, T value )
+            : SimChannelGenerator( ch ), value_( value )
+        {
+        }
 
-        std::string generator_name() const { return "static"; }
+        std::string
+        generator_name( ) const
+        {
+            return "static";
+        }
 
-        std::string other_params() const
+        std::string
+        other_params( ) const
         {
             std::ostringstream os;
             os << "--" << value_;
-            return os.str();
+            return os.str( );
         }
 
-        char* generate(int gps_sec, int gps_nano, char* out)
+        char*
+        generate( int gps_sec, int gps_nano, char* out )
         {
-            int rate = data_rate() / 16;
-            T *out_ = reinterpret_cast<T*>(out);
-            std::fill(out_, out_ + rate, value_);
-            return reinterpret_cast<char*>(out_ + rate);
+            int rate = data_rate( ) / 16;
+            T*  out_ = reinterpret_cast< T* >( out );
+            std::fill( out_, out_ + rate, value_ );
+            return reinterpret_cast< char* >( out_ + rate );
         }
     };
-}
+} // namespace Generators
 
-template <template<class> class GenClass, typename... Args>
+template < template < class > class GenClass, typename... Args >
 GeneratorPtr
-create_generic_generator(int data_type, Args&&... args)
+create_generic_generator( int data_type, Args&&... args )
 {
-    switch (static_cast<daq_data_t>(data_type))
+    switch ( static_cast< daq_data_t >( data_type ) )
     {
-        case _16bit_integer:
-            return GeneratorPtr(new GenClass<std::int16_t>(std::forward<Args>(args)...));
-        case _32bit_integer:
-            return GeneratorPtr(new GenClass<std::int32_t>(std::forward<Args>(args)...));
-        case _64bit_integer:
-            return GeneratorPtr(new GenClass<std::int64_t>(std::forward<Args>(args)...));
-        case _32bit_float:
-            return GeneratorPtr(new GenClass<float>(std::forward<Args>(args)...));
-        case _64bit_double:
-            return GeneratorPtr(new GenClass<double>(std::forward<Args>(args)...));
-        case _32bit_complex:
-            break;
-        case _32bit_uint:
-            return GeneratorPtr(new GenClass<std::uint32_t>(std::forward<Args>(args)...));
-        default:
-            break;
+    case _16bit_integer:
+        return GeneratorPtr(
+            new GenClass< std::int16_t >( std::forward< Args >( args )... ) );
+    case _32bit_integer:
+        return GeneratorPtr(
+            new GenClass< std::int32_t >( std::forward< Args >( args )... ) );
+    case _64bit_integer:
+        return GeneratorPtr(
+            new GenClass< std::int64_t >( std::forward< Args >( args )... ) );
+    case _32bit_float:
+        return GeneratorPtr(
+            new GenClass< float >( std::forward< Args >( args )... ) );
+    case _64bit_double:
+        return GeneratorPtr(
+            new GenClass< double >( std::forward< Args >( args )... ) );
+    case _32bit_complex:
+        break;
+    case _32bit_uint:
+        return GeneratorPtr(
+            new GenClass< std::uint32_t >( std::forward< Args >( args )... ) );
+    default:
+        break;
     }
-    throw std::runtime_error("Unknown data type found, cannot create a generator");
+    throw std::runtime_error(
+        "Unknown data type found, cannot create a generator" );
 }
 
-GeneratorPtr
-create_generator(const std::string& generator, const SimChannel& ch);
+GeneratorPtr create_generator( const std::string& generator,
+                               const SimChannel&  ch );
 
-GeneratorPtr
-create_generator(const std::string& channel_name);
+GeneratorPtr create_generator( const std::string& channel_name );
 
-#endif //DAQD_FE_STREAM_GENERATOR_HH
+#endif // DAQD_FE_STREAM_GENERATOR_HH
-- 
GitLab