1 #ifndef CommonTools_CandUtils_CandCombinerBase_h
2 #define CommonTools_CandUtils_CandCombinerBase_h
13 template <
typename OutputCollection,
typename CandPtr>
62 std::pair<std::pair<CandPtr, size_t>, std::vector<edm::Handle<reco::CandidateView> >::const_iterator> >
66 void combine(
size_t collectionIndex,
95 template <
typename OutputCollection,
typename CandPtr>
97 : checkCharge_(
false), checkOverlap_(
true), dauCharge_(), overlap_(), name_(
name) {}
99 template <
typename OutputCollection,
typename CandPtr>
101 : checkCharge_(
true), checkOverlap_(
true), dauCharge_(2), overlap_(), name_(
name) {
106 template <
typename OutputCollection,
typename CandPtr>
108 : checkCharge_(
true), checkOverlap_(
true), dauCharge_(3), overlap_(), name_(
name) {
114 template <
typename OutputCollection,
typename CandPtr>
116 : checkCharge_(
true), checkOverlap_(
true), dauCharge_(4), overlap_(), name_(
name) {
123 template <
typename OutputCollection,
typename CandPtr>
126 const std::vector<int> &dauCharge,
130 template <
typename OutputCollection,
typename CandPtr>
133 template <
typename OutputCollection,
typename CandPtr>
137 int dq1 = dauCharge_[0], dq2 = dauCharge_[1],
q1 =
c1.charge(),
q2 = c2.
charge();
142 if (checkOverlap_ && overlap_(
c1, c2))
144 return selectPair(
c1, c2);
147 template <
typename OutputCollection,
typename CandPtr>
153 addDaughter(
cmp,
c1, name1);
158 template <
typename OutputCollection,
typename CandPtr>
161 size_t srcSize =
src.size();
162 if (checkCharge_ && dauCharge_.size() != srcSize)
164 <<
"CandCombiner: trying to combine " << srcSize <<
" collections"
165 <<
" but configured to check against " << dauCharge_.size() <<
" charges.";
167 size_t namesSize =
names.size();
173 <<
"CandCombiner: should specify exactly two "
174 <<
" names in configuration (" << namesSize <<
" specified).\n";
179 if (src1.
id() == src2.id()) {
181 const size_t n =
cands.size();
182 for (
size_t i1 = 0;
i1 <
n; ++
i1) {
184 CandPtr cr1(src1,
i1);
187 if (preselect(
c1, c2)) {
188 CandPtr cr2(src2,
i2);
198 const size_t n1 = cands1.
size(),
n2 = cands2.size();
199 for (
size_t i1 = 0;
i1 < n1; ++
i1) {
201 CandPtr cr1(src1,
i1);
202 for (
size_t i2 = 0;
i2 <
n2; ++
i2) {
204 if (preselect(
c1, c2)) {
205 CandPtr cr2(src2,
i2);
223 template <
typename OutputCollection,
typename CandPtr>
226 if (checkCharge_ && dauCharge_.size() != 2)
228 <<
"CandCombiner: trying to combine 2 collections"
229 <<
" but configured to check against " << dauCharge_.size() <<
" charges.";
232 size_t namesSize =
names.size();
237 <<
" names in configuration (" << namesSize <<
" specified).\n";
242 const size_t n =
cands.size();
243 for (
size_t i1 = 0;
i1 <
n; ++
i1) {
245 CandPtr cr1(
src,
i1);
248 if (preselect(
c1, c2)) {
249 CandPtr cr2(
src,
i2);
261 template <
typename OutputCollection,
typename CandPtr>
266 std::vector<edm::Handle<reco::CandidateView> >
src;
272 template <
typename OutputCollection,
typename CandPtr>
278 std::vector<edm::Handle<reco::CandidateView> >
src;
285 template <
typename OutputCollection,
typename CandPtr>
292 std::vector<edm::Handle<reco::CandidateView> >
src;
300 template <
typename OutputCollection,
typename CandPtr>
302 size_t collectionIndex,
309 if (collBegin == collEnd) {
310 static const int undetermined = 0, sameDecay = 1, conjDecay = -1, wrongDecay = 2;
311 int decayType = undetermined;
314 for (
size_t i = 0;
i < qStack.size(); ++
i) {
315 int q = qStack[
i], dq = dauCharge_[
i];
316 if (decayType == undetermined) {
317 if (
q != 0 && dq != 0) {
319 decayType = sameDecay;
321 decayType = conjDecay;
323 decayType = wrongDecay;
325 }
else if ((decayType == sameDecay &&
q != dq) || (decayType == conjDecay &&
q != -dq)) {
326 decayType = wrongDecay;
328 if (decayType == wrongDecay)
332 if (decayType != wrongDecay) {
334 size_t nameIndex = 0;
335 for (
typename CandStack::const_iterator
i =
stack.begin();
i !=
stack.end(); ++
i, ++nameIndex) {
337 addDaughter(
c,
i->first.first,
names[nameIndex]);
339 addDaughter(
c,
i->first.first);
348 size_t candBegin = 0, candEnd =
src.size();
349 for (
typename CandStack::const_iterator
i =
stack.begin();
i !=
stack.end(); ++
i)
350 if (srcRef.
id() ==
i->second->id())
351 candBegin =
i->first.second + 1;
352 for (
size_t candIndex = candBegin; candIndex != candEnd; ++candIndex) {
353 CandPtr candRef(srcRef, candIndex);
354 bool noOverlap =
true;
356 for (
typename CandStack::const_iterator
i =
stack.begin();
i !=
stack.end(); ++
i)
357 if (checkOverlap_ && overlap_(
cand, *(
i->first.first))) {
362 stack.push_back(std::make_pair(std::make_pair(candRef, candIndex), collBegin));
364 qStack.push_back(
cand.charge());
365 combine(collectionIndex + 1,
stack, qStack, collBegin + 1, collEnd, comps,
names);