40 if(DoubleAndWeights.empty())
return 0.;
41 if(DoubleAndWeights.size() == 1)
return DoubleAndWeights.begin()->first;
43#ifdef FSMWMODE1DFINDER_DEBUG
44 msg(MSG::DEBUG) <<
"entered FsmwMode1dFinder::GetMode " <<
endmsg;
51 std::vector<DoubleAndWeight>::const_iterator begin=DoubleAndWeights.begin();
52 std::vector<DoubleAndWeight>::const_iterator end=DoubleAndWeights.end();
54 double overallweight(0.);
55 std::vector<DoubleAndWeight>::const_iterator best_begin=begin;
56 std::vector<DoubleAndWeight>::const_iterator best_end=end;
58#ifdef FSMWMODE1DFINDER_DEBUG
59 msg(MSG::DEBUG) <<
"Size of incoming vector is" << DoubleAndWeights.size() <<
endmsg;
63 double last_value(1e100);
76#ifdef FSMWMODE1DFINDER_DEBUG
77 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"Before \"int step = (int)std::floor(fraction*(end-begin+1))\" " <<
endmsg;
79 int step = (int)std::floor(fraction*(end-begin+1));
82 std::vector<DoubleAndWeight>::const_iterator i=begin;
84 std::vector<DoubleAndWeight>::const_iterator j_end=i+step-1;
85 for (std::vector<DoubleAndWeight>::const_iterator j=i;j!=j_end;++j) {
86#ifdef FSMWMODE1DFINDER_DEBUG
87 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"In the single interval, the component number unknown, value: " << j->first <<
" weight "
90 overallweight+=j->second;
95 std::vector<DoubleAndWeight>::const_iterator i_last = begin+step-1;
97#ifdef FSMWMODE1DFINDER_DEBUG
98 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"After \"int step = (int)std::floor(fraction*(end-begin+1))\" " <<
endmsg;
100 for (std::vector<DoubleAndWeight>::const_iterator i=begin;i!=(end-step+1);++i, ++i_last) {
101#ifdef FSMWMODE1DFINDER_DEBUG
102 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"Interval number unknown, value: " << i->first <<
endmsg;
106 overallweight+= i_last->second;
108 #ifdef FSMWMODE1DFINDER_DEBUG
112 double alt_overallweight=0.;
113 for (std::vector<DoubleAndWeight>::const_iterator j=i;j!=i+step;j++) {
114#ifdef FSMWMODE1DFINDER_DEBUG
115 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"In the single interval, the component number unknown, value: " << j->first <<
" weight "
118 alt_overallweight+=j->second;
120 if (std::abs(alt_overallweight - overallweight) > alt_overallweight * std::numeric_limits<double>::epsilon() * 16 ) {
121 ATH_MSG_ERROR(
"Weights differ: " << alt_overallweight <<
" != " << overallweight);
127 double new_value = ((i+step-1)->first-i->first)/overallweight;
128 if (new_value<last_value) {
129#ifdef FSMWMODE1DFINDER_DEBUG
130 msg(MSG::DEBUG) <<
"New value: " << ((i+step-1)->first-i->first)/overallweight <<
" while the previous one was " <<
132 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"Best case since ever now" <<
endmsg;
134 last_value=((i+step-1)->first-i->first)/overallweight;
138 overallweight-= i->second;
142#ifdef FSMWMODE1DFINDER_DEBUG
143 msg(MSG::DEBUG) <<
"Ended a cycle with success" <<
endmsg;
144 if (begin==best_begin && end ==best_end) {
154 if (best_end-best_begin<=2) isthelast=
true;
162 if (best_end-best_begin==2)
164 std::vector<DoubleAndWeight>::const_iterator medium=begin;
166 return (begin->first*begin->second+medium->first*medium->second+end->first*end->second)/(begin->second+medium->second+end->second);
170 return (begin->first*begin->second+end->first*end->second)/(begin->second+end->second);
179#ifdef FSMWMODE1DFINDER_DEBUG
180 msg(MSG::DEBUG) <<
"entered FsmwMode1dFinder::GetMode " <<
endmsg;
187 std::vector<double>::const_iterator begin=Doubles.begin();
188 std::vector<double>::const_iterator end=Doubles.end();
191 std::vector<double>::const_iterator best_begin=begin;
192 std::vector<double>::const_iterator best_end=end;
194#ifdef FSMWMODE1DFINDER_DEBUG
195 msg(MSG::DEBUG) <<
"Size of incoming vector is" << Doubles.size() <<
endmsg;
199 double last_value(1e100);
201 bool isthelast=
false;
203#ifdef FSMWMODE1DFINDER_DEBUG
204 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"Before \"int step = (int)std::floor(m_fraction*(end-begin+1))\" " <<
endmsg;
206 int step = (int)std::floor(
m_fraction*(end-begin+1));
207#ifdef FSMWMODE1DFINDER_DEBUG
208 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"After \"int step = (int)std::floor(m_fraction*(end-begin+1))\" " <<
endmsg;
210 for (std::vector<double>::const_iterator i=begin;i!=(end-step+1);++i) {
211#ifdef FSMWMODE1DFINDER_DEBUG
212 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"Interval number unknown, value: " << i->first <<
endmsg;
223 if ((*(i+step-1)-*i)<last_value) {
224#ifdef FSMWMODE1DFINDER_DEBUG
225 msg(MSG::DEBUG) <<
"New value: " << *(i+step-1)-*i <<
" while the previous one was " <<
227 if(
msgLvl(MSG::VERBOSE))
msg(MSG::VERBOSE) <<
"Best case since ever now" <<
endmsg;
229 last_value=*(i+step-1)-*i;
235#ifdef FSMWMODE1DFINDER_DEBUG
236 if(
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"Ended a cycle with success" <<
endmsg;
245 if (best_end-best_begin<=2) isthelast=
true;
248 if (best_end-best_begin==2)
250 std::vector<double>::const_iterator medium=begin;
252 return (*begin+*medium+*end)/3.;
256 return (*begin+*end)/2.;