33 #include <osg/Geometry>
34 #include <osg/PrimitiveSet>
37 #include <osg/ref_ptr>
38 #include <osgText/Text>
40 #include "WEEGEvent.h"
41 #include "core/common/WStringUtils.h"
42 #include "core/common/exceptions/WOutOfBounds.h"
43 #include "core/dataHandler/WDataSetDipoles.h"
44 #include "core/dataHandler/WEEG2.h"
45 #include "core/dataHandler/WEEG2Segment.h"
46 #include "core/dataHandler/WEEGValueMatrix.h"
47 #include "core/graphicsEngine/WGEGroupNode.h"
51 std::shared_ptr< WEEG2 > eeg,
52 std::size_t segmentID,
53 osg::ref_ptr< WGEGroupNode > parentNode,
56 std::shared_ptr< WDataSetDipoles > dipoles )
58 m_parentNode( parentNode )
60 if( segmentID < eeg->getNumberOfSegments() )
63 if( snapToDipole && !proofOfConcept && dipoles.get() )
65 const double epsilon = 1e-4;
66 double error = std::numeric_limits<double>::infinity();
67 for(
size_t dipoleId = 0u; dipoleId < dipoles->getNumberOfDipoles(); ++dipoleId )
69 if( time < dipoles->getStartTime( dipoleId ) )
71 if( dipoles->getStartTime( dipoleId ) - time < error )
73 m_time = dipoles->getStartTime( dipoleId ) + epsilon;
74 error = dipoles->getStartTime( dipoleId ) - time;
77 else if( time > dipoles->getEndTime( dipoleId ) )
79 if( time - dipoles->getEndTime( dipoleId ) < error )
81 m_time = dipoles->getEndTime( dipoleId ) - epsilon;
82 error = time - dipoles->getEndTime( dipoleId );
94 const double sampleIDAsDouble =
m_time * eeg->getSamplingRate();
96 std::shared_ptr< WEEG2Segment > segment = eeg->getSegment( segmentID );
97 if( 0.0 <= sampleIDAsDouble && sampleIDAsDouble < segment->getNumberOfSamples() - 1 )
101 const std::size_t sampleID = sampleIDAsDouble;
102 const double fpart = sampleIDAsDouble - sampleID;
103 std::shared_ptr< WEEGValueMatrix > rawValues = segment->getValues( sampleID, 2 );
104 m_values.reserve( eeg->getNumberOfChannels() );
105 for( std::size_t channelID = 0; channelID < eeg->getNumberOfChannels(); ++channelID )
107 m_values.push_back( ( 1.0 - fpart ) * (*rawValues)[channelID][0] + fpart * (*rawValues)[channelID][1] );
112 const osg::Vec4 color( 1.0f, 0.5f, 0.5f, 1.0f );
115 osg::Geometry* geometry =
new osg::Geometry;
117 osg::Vec3Array* vertices =
new osg::Vec3Array();
118 vertices->reserve( 2 );
119 vertices->push_back( osg::Vec3(
m_time, -1048576.0f, 0.0f ) );
120 vertices->push_back( osg::Vec3(
m_time, 1024.0f, 0.0f ) );
121 geometry->setVertexArray( vertices );
123 osg::Vec4Array* colors =
new osg::Vec4Array;
124 colors->push_back( color );
125 geometry->setColorArray( colors );
126 geometry->setColorBinding( osg::Geometry::BIND_OVERALL );
128 geometry->addPrimitiveSet(
new osg::DrawArrays( osg::PrimitiveSet::LINES, 0, 2 ) );
131 osgText::Text* text =
new osgText::Text;
133 text->setPosition( osg::Vec3(
m_time, yPos + 10.0, 0.0 ) );
134 text->setAlignment( osgText::Text::LEFT_CENTER );
135 text->setAxisAlignment( osgText::Text::SCREEN );
136 text->setCharacterSize( 12 );
137 text->setCharacterSizeMode( osgText::Text::SCREEN_COORDS );
138 text->setColor( osg::Vec4( 0.0, 0.0, 1.0, 1.0 ) );
139 text->setBackdropType( osgText::Text::OUTLINE );
140 text->setBackdropColor( osg::Vec4( 1.0, 1.0, 1.0, 1.0 ) );
141 text->setBackdropOffset( 0.1 );
143 osg::Geode* geode =
new osg::Geode;
144 geode->addDrawable( geometry );
145 geode->addDrawable( text );
155 std::ostringstream stream;
156 stream <<
"Invalid time for the EEG: " <<
m_time <<
"s";
162 std::ostringstream stream;
163 stream <<
"The EEG has no segment number " << segmentID;
const std::vector< double > & getValues() const
Get the value of each channel at the time position.
WEEGEvent()
Constructor for an empty event.
osg::ref_ptr< WGEGroupNode > m_parentNode
parent node, where m_node is inserted and removed from
double getTime() const
Get the time position.
double m_time
time position in seconds
~WEEGEvent()
Destructor, removing m_node from m_parentNode.
std::vector< double > m_values
the value of each channel at the given time position
osg::ref_ptr< osg::Node > m_node
OSG node representing the event.
Indicates invalid element access of a container.
std::string toString(const T &value)
Convert a given value to a string.