29 #include <libeep/cnt/cnt.h>
42 #include "WPagerEEGLibeep.h"
43 #include "core/common/exceptions/WOutOfBounds.h"
44 #include "core/dataHandler/WEEGValueMatrix.h"
45 #include "core/dataHandler/exceptions/WDHIOFailure.h"
46 #include "core/dataHandler/exceptions/WDHNoSuchFile.h"
49 WPagerEEGLibeep::WPagerEEGLibeep( std::string fileName )
53 std::setlocale( LC_NUMERIC,
"C" );
56 std::FILE* file = std::fopen( getFilename().c_str(),
"rb" );
59 throw WDHNoSuchFile( getFilename() +
" could not be opened" );
63 m_eeg = eep_init_from_file( getFilename().c_str(), file, &status );
64 if( status != CNTERR_NONE || !m_eeg )
66 std::ostringstream stream;
67 stream << getFilename() <<
" could not be initialized. Libeep status code: " << status;
71 m_nbChannels = eep_get_chanc( m_eeg );
72 m_nbSamples = eep_get_samplec( m_eeg );
74 m_scales = std::vector< double >( m_nbChannels );
75 for(
size_t channelID = 0; channelID < m_nbChannels; ++channelID )
77 m_scales[channelID] = eep_get_chan_scale( m_eeg, channelID );
81 WPagerEEGLibeep::~WPagerEEGLibeep()
84 int status = eep_fclose( m_eeg );
85 if( status != CNTERR_NONE )
87 std::cout << getFilename() <<
" could not be closed. Libeep status code: " << status << std::endl;
91 std::size_t WPagerEEGLibeep::getNumberOfSegments()
const
96 std::size_t WPagerEEGLibeep::getNumberOfChannels()
const
101 std::size_t WPagerEEGLibeep::getNumberOfSamples( std::size_t segmentID )
const
105 std::ostringstream stream;
106 stream << getFilename() <<
" has no segment number " << segmentID;
113 std::shared_ptr< WEEGValueMatrix > WPagerEEGLibeep::getValues( std::size_t segmentID, std::size_t start, std::size_t length )
const
117 std::ostringstream stream;
118 stream << getFilename() <<
" has no segment number " << segmentID;
122 if( start + length > m_nbSamples )
124 std::ostringstream stream;
125 stream <<
"Could not read sample number " << start + length - 1 <<
" of file " << getFilename()
126 <<
", it only has " << m_nbSamples <<
" samples";
130 int status = eep_seek( m_eeg, DATATYPE_EEG, start, 0 );
131 if( status != CNTERR_NONE )
133 std::ostringstream stream;
134 stream <<
"Seek error on " << getFilename() <<
". Libeep status code: " << status;
138 sraw_t* buffer =
new sraw_t[CNTBUF_ARRAYSIZE( m_eeg, length )];
139 status = eep_read_sraw( m_eeg, DATATYPE_EEG, buffer, length );
140 if( status != CNTERR_NONE )
142 std::ostringstream stream;
143 stream <<
"Read error on " << getFilename() <<
". Libeep status code: " << status;
147 std::shared_ptr< WEEGValueMatrix > values(
new WEEGValueMatrix( m_nbChannels, std::vector< double >( length ) ) );
148 for(
size_t channelID = 0; channelID < m_nbChannels; ++channelID )
150 for(
size_t sampleID = 0; sampleID < length; ++sampleID )
152 (*values)[channelID][sampleID] = buffer[sampleID * m_nbChannels + channelID] * m_scales[channelID];
160 double WPagerEEGLibeep::getSamplingRate()
const
162 return eep_get_rate( m_eeg );
165 std::string WPagerEEGLibeep::getChannelUnit( std::size_t channelID )
const
167 if( channelID >= m_nbChannels )
169 std::ostringstream stream;
170 stream << getFilename() <<
" has no channel number " << channelID;
174 return eep_get_chan_unit( m_eeg, channelID );
177 std::string WPagerEEGLibeep::getChannelLabel( std::size_t channelID )
const
179 if( channelID >= m_nbChannels )
181 std::ostringstream stream;
182 stream << getFilename() <<
" has no channel number " << channelID;
186 return eep_get_chan_label( m_eeg, channelID );
Use this for IO error handling.
File not found exception.
Indicates invalid element access of a container.
std::vector< std::vector< double > > WEEGValueMatrix
Values of an EEG.