00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IMPEM_FILTERS_H
00009 #define IMPEM_FILTERS_H
00010
00011 #include "em_config.h"
00012 #include "DensityMap.h"
00013 #include "IMP/algebra/MultiArray.h"
00014
00015 IMPEM_BEGIN_NAMESPACE
00016
00017
00018
00019
00020
00021
00022 template<typename T,int D>
00023 class FilterByThreshold
00024 {
00025 public:
00026 FilterByThreshold() {}
00027
00028 FilterByThreshold(double threshold,int mode,double value) {
00029 set_parameters(threshold,mode,value);
00030 }
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 void set_parameters(T threshold,int mode,T value) {
00041 threshold_ = threshold;
00042 mode_ = mode;
00043 value_ = value;
00044 }
00045
00046 void set_parameters(T threshold,int mode) {
00047 threshold_ = threshold;
00048 mode_ = mode;
00049 value_ = threshold;
00050 }
00051
00052
00053 void apply(algebra::MultiArray<T,D>& m) {
00054 std::vector<int> idx(D);
00055 while (algebra::internal::roll_inds(idx, m.shape(),m.index_bases())) {
00056 switch (mode_) {
00057 case 0:
00058 if(m(idx)<threshold_) {m(idx) = value_;}
00059 break;
00060 case 1:
00061 if(m(idx)>threshold_) {m(idx) = value_;}
00062 break;
00063 }
00064 }
00065 }
00066 protected:
00067 T threshold_;
00068 int mode_;
00069 T value_;
00070 };
00071
00072
00073
00074 class IMPEMEXPORT MapFilterByThreshold
00075 {
00076 public:
00077
00078 MapFilterByThreshold() {}
00079
00080 MapFilterByThreshold(double threshold,int mode,double value) {
00081 set_parameters(threshold,mode,value);
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 void set_parameters(float threshold,int mode,float value);
00093
00094 void set_parameters(float threshold,int mode);
00095
00096 void apply(DensityMap& m);
00097
00098 protected:
00099 float threshold_;
00100 int mode_;
00101 float value_;
00102 };
00103
00104 IMPEM_END_NAMESPACE
00105
00106 #endif