23#ifndef UNIVERSAL_DATA_LOGGER_H
24#define UNIVERSAL_DATA_LOGGER_H
111template <
typename HostNode >
112class UniversalDataLogger
119 UniversalDataLogger( HostNode& );
133 size_t connect_logging_device(
const DataLoggingRequest&,
const RecordablesMap< HostNode >& );
145 void handle(
const DataLoggingRequest& );
157 void record_data(
long );
180 DataLogger_(
const DataLoggingRequest&,
const RecordablesMap< HostNode >& );
182 get_mm_node_id()
const
186 void handle( HostNode&,
const DataLoggingRequest& );
187 void record_data(
const HostNode&,
long );
195 Time recording_interval_;
196 Time recording_offset_;
201 std::vector< typename RecordablesMap< HostNode >::DataAccessFct > node_access_;
211 std::vector< DataLoggingReply::Container > data_;
214 std::vector< size_t > next_rec_;
224 std::vector< DataLogger_ > data_loggers_;
225 typedef typename std::vector< DataLogger_ >::iterator DLiter_;
228 UniversalDataLogger(
const UniversalDataLogger& );
231 UniversalDataLogger
const& operator=(
const UniversalDataLogger& );
236template <
typename HostNode >
238UniversalDataLogger< HostNode >::connect_logging_device(
const DataLoggingRequest& req,
239 const RecordablesMap< HostNode >& rmap )
243 if ( req.get_rport() != 0 )
245 throw IllegalConnection(
"Connections from multimeter to node must request rport 0." );
249 const size_t mm_node_id = req.get_sender().get_node_id();
251 const auto item = std::find_if( data_loggers_.begin(),
253 [ & ](
const DataLogger_& dl ) { return dl.get_mm_node_id() == mm_node_id; } );
255 if ( item != data_loggers_.end() )
257 throw IllegalConnection(
"Each multimeter can only be connected once to a given node." );
262 data_loggers_.push_back( DataLogger_( req, rmap ) );
265 return data_loggers_.size();
268template <
typename HostNode >
269UniversalDataLogger< HostNode >::DataLogger_::DataLogger_(
const DataLoggingRequest& req,
270 const RecordablesMap< HostNode >& rmap )
271 : multimeter_( req.get_sender().get_node_id() )
273 , recording_interval_( Time::neg_inf() )
274 , recording_offset_( Time::ms( 0. ) )
275 , rec_int_steps_( 0 )
276 , next_rec_step_( -1 )
281 const std::vector< std::string >& recvars = req.record_from();
282 for (
size_t j = 0; j < recvars.size(); ++j )
284 typename RecordablesMap< HostNode >::const_iterator rec = rmap.find( recvars[ j ] );
286 if ( rec == rmap.end() )
290 node_access_.clear();
291 throw IllegalConnection(
"Cannot connect with unknown recordable " + recvars[ j ] );
294 node_access_.push_back( rec->second );
297 num_vars_ = node_access_.size();
299 if ( num_vars_ > 0 and req.get_recording_interval() < Time::step( 1 ) )
301 throw IllegalConnection(
"Recording interval must be >= resolution." );
304 recording_interval_ = req.get_recording_interval();
305 recording_offset_ = req.get_recording_offset();
371template <
typename HostNode >
372class DynamicUniversalDataLogger
379 DynamicUniversalDataLogger( HostNode& );
393 size_t connect_logging_device(
const DataLoggingRequest&,
const DynamicRecordablesMap< HostNode >& );
405 void handle(
const DataLoggingRequest& );
417 void record_data(
long );
440 DataLogger_(
const DataLoggingRequest&,
const DynamicRecordablesMap< HostNode >& );
442 get_mm_node_id()
const
446 void handle( HostNode&,
const DataLoggingRequest& );
447 void record_data(
const HostNode&,
long );
455 Time recording_interval_;
456 Time recording_offset_;
461 std::vector< const typename DynamicRecordablesMap< HostNode >::DataAccessFct* > node_access_;
471 std::vector< DataLoggingReply::Container > data_;
474 std::vector< size_t > next_rec_;
483 std::vector< DataLogger_ > data_loggers_;
484 typedef typename std::vector< DataLogger_ >::iterator DLiter_;
487 DynamicUniversalDataLogger(
const DynamicUniversalDataLogger& );
490 DynamicUniversalDataLogger
const& operator=(
const DynamicUniversalDataLogger& );
496template <
typename HostNode >
498DynamicUniversalDataLogger< HostNode >::connect_logging_device(
const DataLoggingRequest& req,
499 const DynamicRecordablesMap< HostNode >& rmap )
503 if ( req.get_rport() != 0 )
505 throw IllegalConnection(
"Connections from multimeter to node must request rport 0." );
509 const size_t mm_node_id = req.get_sender().get_node_id();
510 const size_t n_loggers = data_loggers_.size();
512 while ( j < n_loggers and data_loggers_[ j ].get_mm_node_id() != mm_node_id )
518 throw IllegalConnection(
"Each multimeter can only be connected once to a given node." );
523 data_loggers_.push_back( DataLogger_( req, rmap ) );
526 return data_loggers_.size();
529template <
typename HostNode >
530DynamicUniversalDataLogger< HostNode >::DataLogger_::DataLogger_(
const DataLoggingRequest& req,
531 const DynamicRecordablesMap< HostNode >& rmap )
532 : multimeter_( req.get_sender().get_node_id() )
534 , recording_interval_( Time::neg_inf() )
535 , recording_offset_( Time::ms( 0. ) )
536 , rec_int_steps_( 0 )
537 , next_rec_step_( -1 )
543 const std::vector< std::string >& recvars = req.record_from();
544 for (
size_t j = 0; j < recvars.size(); ++j )
546 typename DynamicRecordablesMap< HostNode >::const_iterator rec = rmap.find( recvars[ j ] );
548 if ( rec == rmap.end() )
552 node_access_.clear();
553 throw IllegalConnection(
"Cannot connect with unknown recordable " + recvars[ j ] );
556 node_access_.push_back( &( rec->second ) );
559 num_vars_ = node_access_.size();
561 if ( num_vars_ > 0 and req.get_recording_interval() < Time::step( 1 ) )
563 throw IllegalConnection(
"Recording interval must be >= resolution." );
566 recording_interval_ = req.get_recording_interval();
567 recording_offset_ = req.get_recording_offset();
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33