00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxExportExtraIdentMaskStdev_h
00012 #define HxExportExtraIdentMaskStdev_h
00013
00014 #include "HxClassName.h"
00015 #include "HxSizes.h"
00016 #include "HxCategories.h"
00017 #include "HxTagList.h"
00018
00019
00023 template<class ResultT, class ImValT, class ExtraValT>
00024 class HxExportExtraIdentMaskStdev
00025 {
00026 public:
00028 typedef HxTagTransInVar TransVarianceCategory;
00029
00031 typedef HxTag1Phase PhaseCategory;
00032
00033
00035 HxExportExtraIdentMaskStdev(HxTagList& tags);
00036
00038 ~HxExportExtraIdentMaskStdev();
00039
00041 void doIt(const ImValT& imV, const ExtraValT& extraV);
00042
00044 static HxString className();
00045
00046 private:
00047 HxTagList& _tags;
00048 ExtraValT _maskVal;
00049 ResultT _sum;
00050 ResultT _sumSqr;
00051 HxScalarInt _num;
00052 bool _exportVariance;
00053 };
00054
00055 template<class ResultT, class ImValT, class ExtraValT>
00056
00057 HxExportExtraIdentMaskStdev<ResultT,ImValT,ExtraValT>::HxExportExtraIdentMaskStdev(HxTagList& tags) : _tags(tags)
00058 {
00059 _maskVal = HxGetTag<int>(tags, "maskVal");
00060 _exportVariance = HxGetTag(tags, "exportVariance",false);
00061 _sum = HxScalarInt(0);
00062 _sumSqr = HxScalarInt(0);
00063 _num = 0;
00064 }
00065
00066 template<class ResultT, class ImValT, class ExtraValT>
00067 HxExportExtraIdentMaskStdev<ResultT,ImValT,ExtraValT>::~HxExportExtraIdentMaskStdev()
00068 {
00069 ResultT num = _num;
00070 ResultT num1 = _num - 1;
00071 ResultT result = (_num == 1) ? ResultT(HxScalarInt(0))
00072 : (_sumSqr - ((_sum * _sum) / num)) / (num1);
00073 if(!_exportVariance)
00074 result = result.sqrt();
00075 HxAddTag(_tags, "result", HxValue(result));
00076 }
00077
00078 template<class ResultT, class ImValT, class ExtraValT>
00079 inline void
00080
00081 HxExportExtraIdentMaskStdev<ResultT,ImValT,ExtraValT> ::doIt(const ImValT& imV, const ExtraValT& extraV)
00082 {
00083 if (extraV == _maskVal) {
00084 _sum += imV;
00085 _sumSqr += imV * imV;
00086 _num += 1;
00087 }
00088 }
00089
00090 template<class ResultT, class ImValT, class ExtraValT>
00091 inline HxString
00092 HxExportExtraIdentMaskStdev<ResultT,ImValT,ExtraValT>::className()
00093 {
00094 return HxString("identMaskStdev");
00095 }
00096
00097
00098 #endif