18 #include <utility/tag/Tag.hh>
22 #include <basic/Tracer.hh>
26 #include <utility/vector1.hh>
27 #include <numeric/Calculator.hh>
28 #include <numeric/random/random.hh>
31 #include <boost/foreach.hpp>
32 #define foreach BOOST_FOREACH
37 static basic::Tracer
TR(
"protocols.filters.CalculatorFilter" );
41 Filter(
"CalculatorFilter" ),
46 Filter(
"CalculatorFilter" ),
49 calc_ =
new numeric::Calculator(equation);
53 Filter(
"CalculatorFilter" ),
55 values_(other.values_),
56 filters_(other.filters_),
57 threshold_(other.threshold_)
79 out<<
"CalculatorFilter returns "<<
compute(pose) <<std::endl;
85 utility_exit_with_message(
"Calculator filter can't use non-existant (null pointer) filter.");
98 std::map< std::string, core::Real > vars(
values_);
99 for( std::map<std::string, protocols::filters::FilterOP>::const_iterator iter(
filters_.begin()); iter !=
filters_.end(); ++iter) {
100 assert(iter->second);
101 vars[ iter->first ] = (iter->second)->
report_sm( pose );
104 if(
calc_->compute(vars, value) ) {
105 TR.Error <<
"Problem calculating equation in CalculatorFilter - resultant value likely garbage." << std::endl;
123 if( sub_tag_ptr->hasOption(
"filter") || sub_tag_ptr->hasOption(
"filter_name") ) {
125 if( sub_tag_ptr->hasOption(
"filter_name") ) {
126 filter_name = sub_tag_ptr->getOption<
std::string>(
"filter_name" );
128 filter_name = sub_tag_ptr->getOption<
std::string>(
"filter" );
131 }
else if ( sub_tag_ptr->hasOption(
"value") ) {
134 utility_exit_with_message(
"CalculatorFilter subtag must have either filter or value set.");
139 calc_ =
new numeric::Calculator( equation );
140 std::map< std::string, core::Real > vars(
values_);
141 for( std::map<std::string, protocols::filters::FilterOP>::iterator iter(
filters_.begin()); iter !=
filters_.end(); ++iter) {
142 vars[ iter->first ] = 1.0 + 0.00001 * numeric::random::uniform();
145 if(
calc_->compute(vars, dummy) ) {
146 utility_exit_with_message(
"Bad equation in CalculatorFilter: " + equation);