00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef PSYCHO_EYEDATA_H_DEFINED
00038 #define PSYCHO_EYEDATA_H_DEFINED
00039
00040 #include "Image/Point2D.H"
00041 #include "Psycho/SaccadeState.H"
00042 #include "Util/Types.H"
00043 #include "Util/StringUtil.H"
00044 #include "Util/log.H"
00045 #include "rutz/compat_cmath.h"
00046 #include "rutz/shared_ptr.h"
00047 #include "Component/ParamMap.H"
00048 #include <cmath>
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 class EyeData
00059 {
00060 public:
00061
00062 inline EyeData(const float x_, const float y_, const float pdiam_,
00063 const SaccadeState sstate_, const bool bstate_);
00064
00065
00066 inline EyeData(const float x_, const float y_, const float pdiam_,
00067 const SaccadeState sstate_, const bool bstate_,
00068 rutz::shared_ptr<ParamMap> dat);
00069
00070
00071 inline EyeData(const float x_, const float y_, const float pdiam_,
00072 const SaccadeState sstate_, const bool bstate_,
00073 const float dx_, const float dy_, const float ampl_,
00074 const float dur_, const float time_,
00075 const unsigned int num_);
00076
00077
00078
00079
00080
00081
00082
00083
00084 inline ~EyeData();
00085
00086
00087
00088
00089
00090
00091
00092 inline bool isInUnknown() const;
00093
00094
00095 inline bool isInFixation() const;
00096
00097
00098 inline bool isInSaccade() const;
00099
00100
00101 inline bool isInSmoothPursuit() const;
00102
00103
00104 inline bool isInBlink() const;
00105
00106
00107 inline bool isInCombinedSaccade() const;
00108
00109
00110 inline SaccadeState saccadeState() const;
00111
00112
00113 inline bool hasPupilDiam() const;
00114
00115
00116
00117
00118
00119 inline bool hasMetaData(const std::string field) const;
00120
00121 inline bool hasSpecialMetaData(const std::string field) const;
00122
00123
00124
00125
00126
00127
00128
00129 inline bool hasSaccadeTargetData() const;
00130
00131
00132 inline bool isValid() const;
00133
00134
00135 inline bool isWithin(const Dims& dims) const;
00136
00137
00138 inline bool isSpecialField(std::string field) const;
00139
00140
00141
00142
00143
00144
00145
00146
00147 inline void getPosition(float& xx, float& yy) const;
00148
00149
00150 inline Point2D<int> position() const;
00151
00152
00153
00154
00155
00156 inline float pupilDiameter() const;
00157
00158
00159 inline rutz::shared_ptr<ParamMap> getMetaData() const;
00160
00161
00162 inline std::vector<std::string> getMetaDataList() const;
00163
00164
00165 inline double getMetaDataField(std::string field) const;
00166
00167
00168
00169
00170 inline void getSaccadeTarget(float& targx, float& targy) const;
00171
00172
00173
00174
00175 inline Point2D<int> saccadeTarget() const;
00176
00177
00178
00179
00180 inline float saccadeAmplitude() const;
00181
00182
00183
00184
00185 inline float saccadeDuration() const;
00186
00187
00188
00189
00190 inline float saccadeTime() const;
00191
00192
00193
00194
00195
00196 inline unsigned int saccadeNumber() const;
00197
00198
00199
00200
00201 private:
00202
00203 const float x, y;
00204 const float pdiam;
00205 const SaccadeState sstate;
00206 const bool bstate;
00207
00208 const rutz::shared_ptr<ParamMap> itsExtraData;
00209 inline std::string special(std::string field) const;
00210 inline std::string unspecial(std::string field) const;
00211
00212 };
00213
00214
00215
00216
00217
00218
00219 inline EyeData::EyeData(const float x_, const float y_, const float pdiam_,
00220 const SaccadeState sstate_, const bool bstate_) :
00221 x(x_), y(y_), pdiam(pdiam_), sstate(sstate_), bstate(bstate_),
00222 itsExtraData(new ParamMap)
00223 { }
00224
00225 inline EyeData::EyeData(const float x_, const float y_, const float pdiam_,
00226 const SaccadeState sstate_, const bool bstate_,
00227 rutz::shared_ptr<ParamMap> dat) :
00228 x(x_), y(y_), pdiam(pdiam_), sstate(sstate_), bstate(bstate_),
00229 itsExtraData(dat)
00230 {}
00231 inline EyeData::EyeData(const float x_, const float y_, const float pdiam_,
00232 const SaccadeState sstate_, const bool bstate_,
00233 const float dx_, const float dy_, const float ampl_,
00234 const float dur_, const float time_,
00235 const unsigned int num_) :
00236 x(x_), y(y_), pdiam(pdiam_), sstate(sstate_), bstate(bstate_),
00237 itsExtraData(new ParamMap)
00238 {
00239 itsExtraData->putDoubleParam("targetx",dx_);
00240 itsExtraData->putDoubleParam("targety",dy_);
00241 itsExtraData->putDoubleParam("ampl",ampl_);
00242 itsExtraData->putDoubleParam("dur",dur_);
00243 itsExtraData->putDoubleParam("time",time_);
00244 itsExtraData->putDoubleParam("num",num_);
00245 }
00246
00247 inline EyeData::~EyeData()
00248 { }
00249
00250 inline bool EyeData::isInUnknown() const
00251 { return (sstate == SACSTATE_UNK); }
00252
00253 inline bool EyeData::isInFixation() const{ return (sstate == SACSTATE_FIX); }
00254
00255 inline bool EyeData::isInSaccade() const
00256 { return (sstate == SACSTATE_SAC) || (sstate == SACSTATE_COM); }
00257
00258 inline bool EyeData::isInSmoothPursuit() const
00259 { return (sstate == SACSTATE_SMO); }
00260
00261 inline bool EyeData::isInBlink() const
00262 { return bstate; }
00263
00264 inline bool EyeData::isInCombinedSaccade() const
00265 { return (sstate == SACSTATE_COM); }
00266
00267 inline SaccadeState EyeData::saccadeState() const
00268 { return sstate; }
00269
00270 inline bool EyeData::hasPupilDiam() const
00271 { return !isnan(pdiam); }
00272
00273 inline bool EyeData::hasMetaData(const std::string field = "any") const
00274 { if(field.compare("any") == 0) return itsExtraData.is_valid();
00275 else return (itsExtraData.is_valid() &&
00276 (itsExtraData->hasParam(field) ||
00277 itsExtraData->hasParam(special(field)) )); }
00278
00279 inline bool EyeData::hasSpecialMetaData(const std::string field) const
00280 {
00281 return (hasMetaData("any") && itsExtraData->hasParam(special(field)));
00282 }
00283
00284
00285
00286 inline bool EyeData::hasSaccadeTargetData() const
00287 {
00288 std::vector<std::string> sac_args;
00289
00290
00291 const std::string fields("targetx targety");
00292 split(fields," ", std::back_inserter(sac_args));
00293
00294 for(std::vector<std::string>::iterator iter = sac_args.begin();
00295 iter != sac_args.end();
00296 ++iter)
00297 if (hasMetaData(*iter) == false) return false;
00298 return true;
00299 }
00300
00301 inline bool EyeData::isValid() const
00302 { return !(isnan(x) || isnan(y)); }
00303
00304 inline bool EyeData::isWithin(const Dims& dims) const
00305 {
00306 if (isValid() == false) return false;
00307 const int i = int(x + 0.49999F), j = int(y + 0.49999F);
00308 return (i >= 0 && i < dims.w() && j >= 0 && j < dims.h());
00309 }
00310
00311 inline bool EyeData::isSpecialField(std::string field) const
00312 {
00313 return field[0]=='*';
00314 }
00315
00316 inline void EyeData::getPosition(float& xx, float& yy) const
00317 { xx = x; yy = y; }
00318
00319 inline Point2D<int> EyeData::position() const
00320 { return Point2D<int>(int(x + 0.49999F), int(y + 0.49999F)); }
00321
00322 inline float EyeData::pupilDiameter() const
00323 { return pdiam; }
00324
00325 inline rutz::shared_ptr<ParamMap> EyeData::getMetaData() const
00326 { return itsExtraData; }
00327
00328 inline std::vector<std::string> EyeData::getMetaDataList() const
00329 {
00330 std::vector<std::string> argList;
00331 if(hasMetaData())
00332 for (ParamMap::key_iterator iter = getMetaData()->keys_begin();
00333 iter != getMetaData()->keys_end();
00334 ++iter)
00335 argList.push_back(*iter);
00336
00337 return argList; }
00338
00339 inline double EyeData::getMetaDataField(std::string field) const
00340 {
00341 if (hasSpecialMetaData(field))
00342 return itsExtraData->getDoubleParam(special(field));
00343 else if(hasMetaData(field))
00344 return itsExtraData->getDoubleParam(field);
00345 else LFATAL("No data field %s in EyeData",field.c_str());
00346 return -1;
00347 }
00348
00349 inline void EyeData::getSaccadeTarget(float& targx, float& targy) const
00350 { targx = getMetaDataField("targetx");
00351 targy = getMetaDataField("targety"); }
00352
00353 inline Point2D<int> EyeData::saccadeTarget() const
00354 {
00355 if(hasSaccadeTargetData())
00356 {
00357 float dx, dy;
00358 getSaccadeTarget(dx, dy);
00359 return Point2D<int>(int(dx + 0.49999F), int(dy + 0.49999F));
00360 }
00361 else
00362 { return Point2D<int>(1,1);}
00363 }
00364
00365 inline float EyeData::saccadeAmplitude() const
00366 { return getMetaDataField("amp"); }
00367
00368 inline float EyeData::saccadeDuration() const
00369 { return itsExtraData->getDoubleParam("dur"); }
00370
00371 inline float EyeData::saccadeTime() const
00372 { return itsExtraData->getDoubleParam("time"); }
00373
00374 inline unsigned int EyeData::saccadeNumber() const
00375 { return uint(itsExtraData->getDoubleParam("num")); }
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 inline std::string EyeData::special(std::string field) const
00401 {
00402 if(field[0]=='*') return field;
00403 else return "*"+field;
00404 }
00405
00406 inline std::string EyeData::unspecial(std::string field) const
00407 {
00408 if(field[0]=='*') return field.erase(0,1);
00409 else return field;
00410 }
00411 #endif // PSYCHO_EYEDATA_H_DEFINED