00001
00002
00003
00004
00005
00006
00007 #ifndef BALL_NMR_PEAK_H
00008 #define BALL_NMR_PEAK_H
00009
00010 #ifndef BALL_MATHS_VECTOR3_H
00011 # include <BALL/MATHS/vector3.h>
00012 #endif
00013
00014 #ifndef BALL_MATHS_VECTOR2_H
00015 # include <BALL/MATHS/vector2.h>
00016 #endif
00017
00018 #ifndef BALL_CONCEPT_PROPERTY_H
00019 # include <BALL/CONCEPT/property.h>
00020 #endif
00021
00022 #include <iostream>
00023
00024 namespace BALL
00025 {
00026 class Atom;
00027
00034 template <typename PositionType>
00035 class Peak
00036 : public PropertyManager
00037 {
00038 public:
00039
00043
00044 typedef PositionType Position;
00046
00050
00053 Peak();
00054
00057 Peak(const Peak& peak);
00058
00061 virtual ~Peak();
00062
00064
00067
00070 const Position& getPosition() const;
00071
00074 const Position& getWidth() const;
00075
00078 float getIntensity() const;
00079
00082 void setPosition(const Position& position);
00083
00086 void setWidth(const Position& width);
00087
00090 void setIntensity(float intensity);
00091
00094 const Atom* getAtom() const;
00095
00098 void setAtom(const Atom* atom);
00099
00101
00104
00107 void operator = (const Peak& peak);
00108
00110
00113
00116 bool operator == (const Peak<PositionType>& peak) const;
00117
00120 bool operator < (const Peak<PositionType>& peak) const;
00121
00124 bool operator > (const Peak<PositionType>& peak) const;
00126
00127 protected:
00128
00129 Position position_;
00130 Position width_;
00131 float intensity_;
00132 const Atom* atom_;
00133 };
00134
00135 template <typename PositionType>
00136 Peak<PositionType>::Peak()
00137 : PropertyManager(),
00138 position_(),
00139 width_(),
00140 intensity_(0),
00141 atom_(0)
00142 {
00143 }
00144
00145 template <typename PositionType>
00146 Peak<PositionType>::~Peak()
00147 {
00148 }
00149
00150 template <typename PositionType>
00151 Peak<PositionType>::Peak(const Peak<PositionType>& peak)
00152 : PropertyManager(peak),
00153 position_(peak.position_),
00154 width_(peak.width_),
00155 intensity_(peak.intensity_),
00156 atom_(peak.atom_)
00157 {
00158 }
00159
00160 template <typename PositionType>
00161 BALL_INLINE
00162 const typename Peak<PositionType>::Position& Peak<PositionType>::getPosition() const
00163 {
00164 return position_;
00165 }
00166
00167 template <typename PositionType>
00168 BALL_INLINE
00169 const typename Peak<PositionType>::Position& Peak<PositionType>::getWidth() const
00170 {
00171 return width_;
00172 }
00173
00174 template <typename PositionType>
00175 BALL_INLINE
00176 void Peak<PositionType>::setPosition(const typename Peak<PositionType>::Position& position)
00177 {
00178 position_ = position;
00179 }
00180
00181 template <typename PositionType>
00182 BALL_INLINE
00183 void Peak<PositionType>::setWidth(const typename Peak<PositionType>::Position& width)
00184 {
00185 width_ = width;
00186 }
00187
00188 template <typename PositionType>
00189 BALL_INLINE
00190 float Peak<PositionType>::getIntensity() const
00191 {
00192 return intensity_;
00193 }
00194
00195 template <typename PositionType>
00196 BALL_INLINE
00197 void Peak<PositionType>::setIntensity(float intensity)
00198 {
00199 intensity_ = intensity;
00200 }
00201
00202 template <typename PositionType>
00203 BALL_INLINE
00204 const Atom* Peak<PositionType>::getAtom() const
00205 {
00206 return atom_;
00207 }
00208
00209 template <typename PositionType>
00210 BALL_INLINE
00211 void Peak<PositionType>::setAtom(const Atom* atom)
00212 {
00213 atom_ = atom;
00214 }
00215
00216 template <typename PositionType>
00217 void Peak<PositionType>::operator = (const Peak<PositionType>& peak)
00218 {
00219 position_ = peak.position_;
00220 width_ = peak.width_;
00221 intensity_ = peak.intensity_;
00222 atom_ = peak.atom_;
00223 }
00224
00225 template <typename PositionType>
00226 bool Peak<PositionType>::operator == (const Peak<PositionType>& peak) const
00227 {
00228 return ((position_ == peak.position_)
00229 && (width_ == peak.width_)
00230 && (intensity_ == peak.intensity_)
00231 && (atom_ == peak.atom_));
00232 }
00233
00234 template <typename PositionType>
00235 bool Peak<PositionType>::operator < (const Peak<PositionType>& peak) const
00236 {
00237 return (position_ < peak.position_);
00238 }
00239
00240 template <typename PositionType>
00241 bool Peak<PositionType>::operator > (const Peak<PositionType>& peak) const
00242 {
00243 return (position_ > peak.position_);
00244 }
00245
00248 template <typename PositionType>
00249 std::ostream& operator << (std::ostream& os, const Peak<PositionType>& peak)
00250 {
00251 return (os << "[ peak @ " << peak.getPosition()
00252 << ": intensity = " << peak.getIntensity()
00253 << ", width = " << peak.getWidth()
00254 << "] ");
00255 }
00256
00261 typedef Peak<float> Peak1D;
00262 typedef Peak<Vector2> Peak2D;
00263 typedef Peak<Vector3> Peak3D;
00265
00266
00267 }
00268
00269 #endif // BALL_NMR_PEAK_H