Segmentation.hxx
Go to the documentation of this file.00001 #ifndef Segmentation_hxx
00002 #define Segmentation_hxx
00003
00004 #include <vector>
00005 #include <algorithm>
00006 #include <iterator>
00007 #include <cmath>
00008 #include <sstream>
00009 #include "Array.hxx"
00010 #include "XMLAdapter.hxx"
00011
00012 namespace CLAM
00013 {
00014 class Segmentation : public Component
00015 {
00016 public:
00017 class InsertedOutOfBounds : public std::exception
00018 {
00019 public:
00020 const char * what() const throw () { return "Segmentation point inserted out of limits";}
00021 };
00022 typedef std::vector<double> TimePositions;
00023 public:
00024 Segmentation()
00025 : _current(0)
00026 , _maxPosition(0)
00027 {
00028 }
00029 Segmentation(double maxPosition)
00030 : _current(0)
00031 , _maxPosition(maxPosition)
00032 {
00033 }
00034 virtual ~Segmentation();
00038 virtual unsigned insert(double timePosition)=0;
00045 virtual void remove(unsigned segment)=0;
00052 virtual unsigned pickOffset(double timePosition, double tolerance) const=0;
00059 virtual unsigned pickOnset(double timePosition, double tolerance) const=0;
00063 virtual unsigned pickSegmentBody(double timePosition) const=0;
00069 virtual void dragOnset(unsigned segment, double newTimePosition)=0;
00075 virtual void dragOffset(unsigned segment, double newTimePosition)=0;
00076
00077 virtual void fillArray(DataArray& segmentation) const =0;
00081 virtual void takeArray(const TData * begin, const TData * end) =0;
00082
00083 const char * GetClassName() const { return "Segmentation"; }
00084
00085 void StoreOn(Storage & storage) const
00086 {
00087 XMLAdapter<double> adapter(_maxPosition, "max", false);
00088 storage.Store(adapter);
00089 CLAM::DataArray array;
00090 fillArray(array);
00091 array.StoreOn(storage);
00092 }
00093
00094 void LoadFrom(Storage & storage)
00095 {
00096 double newmaxPosition;
00097 XMLAdapter<double> adapter(newmaxPosition, "max", false);
00098 if(storage.Load(adapter))
00099 {
00100 maxPosition(newmaxPosition);
00101 }
00102 else {
00103
00104 maxPosition(100000);
00105 }
00106 DataArray array;
00107 array.LoadFrom(storage);
00108 const unsigned size = array.Size();
00109 const TData* ptr=array.GetPtr();
00110 takeArray(ptr, ptr+size);
00111
00112 }
00113
00114 void select(unsigned segment)
00115 {
00116 _selection[segment]=true;
00117 }
00118 void deselect(unsigned segment)
00119 {
00120 _selection[segment]=false;
00121 }
00122 void clearSelection()
00123 {
00124 for (unsigned i=0; i<_selection.size(); i++)
00125 _selection[i]=false;
00126 }
00127
00131 std::string boundsAsString() const
00132 {
00133 std::ostringstream os;
00134 for (unsigned i=0; i<_offsets.size(); i++)
00135 {
00136 if (_selection[i]) os << "+";
00137 os << "(" << _onsets[i] << "," << _offsets[i] << ") ";
00138 }
00139 return os.str();
00140 }
00141
00145 const TimePositions & onsets() const
00146 {
00147 return _onsets;
00148 }
00152 const TimePositions & offsets() const
00153 {
00154 return _offsets;
00155 }
00159 const std::vector<std::string> & labels() const
00160 {
00161 return _labels;
00162 }
00166 void setLabel(unsigned segment, std::string label)
00167 {
00168 if (segment>=_labels.size()) return;
00169 _labels[segment] = label;
00170 }
00174 const std::vector<bool> & selections() const
00175 {
00176 return _selection;
00177 }
00181 unsigned current() const
00182 {
00183 return _current;
00184 }
00188 void current(unsigned index)
00189 {
00190 if (index>=_onsets.size()) return;
00191 _current = index;
00192 }
00193 double maxPosition() const
00194 {
00195 return _maxPosition;
00196 }
00197 virtual void maxPosition(double maxPosition)
00198 {
00199 _maxPosition = maxPosition;
00200 }
00201 void xUnits(const std::string & units)
00202 {
00203 _xUnits=units;
00204 }
00205 const std::string & xUnits() const
00206 {
00207 return _xUnits;
00208 }
00209 protected:
00210 TimePositions _onsets;
00211 TimePositions _offsets;
00212 std::vector<std::string> _labels;
00213 std::vector<bool> _selection;
00214 unsigned _current;
00215 double _maxPosition;
00216 std::string _xUnits;
00217 };
00218
00219 }
00220
00221
00222
00223 #endif//Segmentation_hxx
00224