BOSS 7.1.2
BESIII Offline Software System
Loading...
Searching...
No Matches
CombinatoricList.cc
Go to the documentation of this file.
1#ifndef DCHAIN_COMBINATORICLIST_CC
2#define DCHAIN_COMBINATORICLIST_CC
3// -*- C++ -*-
4//
5// Package: DChain
6// Module: CombinatoricList
7//
8// Description: container used to build Decay subclass objects
9//
10// Implimentation:
11// <Notes on implimentation>
12//
13// Author: Simon Patton
14// Created: Sat Oct 5 17:18:02 EDT 1996
15// $Id: CombinatoricList.cc,v 1.2 2009/09/22 08:22:26 hujf Exp $
16//
17// Revision history
18//
19// $Log: CombinatoricList.cc,v $
20// Revision 1.2 2009/09/22 08:22:26 hujf
21// see ChangeLog
22//
23// Revision 1.1.1.1 2009/03/03 06:06:56 maqm
24// first import of DecayChain
25//
26// Revision 1.1 2006/01/11 20:28:35 cdj
27// massive class renaming, addition of [] for selection and unit tests
28//
29// Revision 1.10 2003/05/15 19:56:12 cdj
30// revamped memory handling so always use a ReferenceHolder to deal with the reference counting
31//
32// Revision 1.9 2003/03/13 20:19:16 cleo3
33// now compiles under Linux
34//
35// Revision 1.8 2002/06/21 14:20:51 cdj
36// previous changes now compile under OSF1
37//
38// Revision 1.7 2002/06/19 20:37:10 cleo3
39// added missing typename and create a copy constructor
40//
41// Revision 1.6 2002/06/18 20:52:04 cdj
42// fixed bug that occurred when mulitplying 3 or more of the same list and conjugation where one of the list was the first list of the combination
43//
44// Revision 1.5 2001/04/20 14:02:09 ajm36
45// plug memory leak associated with makeDecay
46//
47// Revision 1.4 2001/04/10 13:56:48 urner
48// bug fixes
49//
50// Revision 1.3 2001/03/30 19:41:12 cdj
51// improved memory usage when doing combinatorics
52//
53// Revision 1.2 2001/03/29 21:33:38 cdj
54// initial try at bug fix for selfCongugateList*nonSelfCongugateList
55//
56// Revision 1.1.1.1 2000/12/18 22:16:55 cdj
57// imported DChain
58//
59// Revision 1.13 1998/08/21 00:51:54 sjp
60// Modifier to no longer use typedefs
61//
62// Revision 1.12 1998/08/20 20:00:09 sjp
63// Modified to use DChainBoolean
64//
65// Revision 1.11 1998/08/19 20:46:21 sjp
66// Fixed comments and removed report references
67//
68// Revision 1.10 1998/04/17 19:14:49 sjp
69// Modified to use latest type
70//
71// Revision 1.9 1997/09/03 14:58:22 sjp
72// Use new report.h and TBParticlePoint
73//
74// Revision 1.8 1997/08/28 07:00:35 sjp
75// Modified files to handle complete templating
76//
77// Revision 1.7 1997/08/19 23:03:14 sjp
78// Restructured package to be independent of Rock
79//
80// Revision 1.6 1997/08/19 16:19:03 sjp
81// Improved handling of STL containers
82//
83// Revision 1.5 1997/08/15 21:33:35 sjp
84// Updated to use <package>/<file>.h include structure.
85// Updated to use bug flags specified in Experiement.h
86//
87// Revision 1.4 1997/01/31 20:16:24 sjp
88// Modified to use the new `bug' include files
89//
90// Revision 1.3 1997/01/21 20:31:34 sjp
91// Changed CPP flags and include because of library reorganization
92//
93// Revision 1.2 1996/12/20 21:14:01 sjp
94// Changed aPossible to Possible and added dropLink where nec.
95//
96// Revision 1.1 1996/11/04 17:17:12 sjp
97// New file for new `List' module
98//
99
100// system include files
101#include <stdlib.h> // For 'exit'
102
103// user include files
113
115
116//
117// constants, enums and typedefs
118//
119namespace dchain {
120static const conjugation::Label kBaseLabel = conjugation::kHeads ;
121
122//
123// local functions
124//
125
126// The follwing function is local rather than a member of CombinatoricList
127// as that would require the file <vector> to be included in
128// CombinatoricList.h, and thus in many other parts of the code. That
129// inclusion can sieverly slow down compliation and also cause many
130// local copies of the code to be generated. It is best to avoid this.
131//
132// Now, you may ask why make this a static function in a class. The simple
133// answer is it works! I tried this as a simple, normal static
134// (i.e. file-scope) function and my compilers barfed. Why do it work
135// in a class? I don't know, but it does so lets just get one with it!
136
137template < class DecayClass, class CandidateClass >
139public:
140 class ChildList {
141 public:
142
144 m_list.reserve(4);
145 }
146
147 ChildList(const DecayClass* decay) {
148 //fill the m_list with decay
149 uint32_t n = decay->numberChildren();
150 for ( uint32_t i = 0; i < n; i++) m_list.push_back(&(decay->child(i)));
151 }
152
153 void push_back( const CandidateClass* iCandidate ) {
154 m_list.push_back( iCandidate );
155 }
156 void pop_back() {
157 m_list.pop_back();
158 }
159 void eraseAll() {
160 m_list.erase(m_list.begin(), m_list.end());
161 }
162
163 bool overlap( const CandidateClass& iCandidate ) const {
164 for( typename std::vector<const CandidateClass*>::const_iterator itChild =
165 m_list.begin();
166 itChild != m_list.end();
167 ++itChild ) {
168 if( iCandidate.overlap( *(*itChild) ) ) {
169 return true;
170 }
171 }
172 return false;
173 }
174
175 DecayClass* makeDecay() {
176 DecayClass* returnValue = new DecayClass( *(m_list.front()) );
177 for( typename std::vector<const CandidateClass*>::iterator itChild = m_list.begin()+1;
178 itChild != m_list.end();
179 ++itChild ) {
180 returnValue->addChild( *(*itChild) );
181 }
182 return returnValue;
183 }
184 private:
185 std::vector<const CandidateClass*> m_list;
186 };
187
189 const typename _combinatoricloop_vector_::iterator& aBegin ,
190 const typename _combinatoricloop_vector_::iterator& aEnd ,
191 const conjugation::Label aLabel ,
193 {
194 ChildList childList;
195
198 entry != itEnd;
199 ++entry ) {
200
201 iLoop.setCurrentIterator( entry ) ;
202
203 childList.push_back( & (*entry).labeledClass() );
204
205 //
206 // Note: need to cast way `const' to make sure a non-const LabeledParticleList
207 // is returned
208 //
209 doIt( aBegin,
210 aEnd,
211 childList ,
212 aLabel,
213 aDecayList );
214 childList.eraseAll();
215 }
216 }
217
218 static void doIt( const typename _combinatoricloop_vector_::iterator& aBegin ,
219 const typename _combinatoricloop_vector_::iterator& aEnd ,
220 ChildList& iList ,
221 const conjugation::Label aLabel ,
223 {
224 if ( aBegin == aEnd ) {
225 //
226 // if all ConjuagetLists have been used add Decay to the final list
227 //
228 DecayClass* ptr = iList.makeDecay();
229 ReferenceHolder<DecayClass> pHolder(ptr);
231 ptr,
232 aLabel ) ) ;
233 }
234 else {
235 //
236 // make iterator for next ConjugateList loop
237 //
238 const typename _combinatoricloop_vector_::iterator newBegin( aBegin + 1 ) ;
239 //
240 // loop over each entry in the current ConjugateList
241 //
242 typename dchain::CandidateList< CandidateClass >::const_partial_iterator finished( (*(*aBegin)).partial_end() ) ;
243 for ( typename dchain::CandidateList< CandidateClass >::const_partial_iterator entry( (*(*aBegin)).partial_begin() ) ;
244 entry != finished ;
245 ++entry ) {
246 if ( !( iList.overlap( (*entry)() ) ) ) {
247 //
248 // If baseDecay does not overlap current element in the this ConjugateList,
249 // record the current element of this Loop
250 //
251 (*(*aBegin)).setCurrentIterator( entry ) ;
252 //
253 // build new baseDecay with old baseDecay plus the current element
254 //
255 iList.push_back( & (*entry).labeledClass() );
256 //
257 // do all successive ConjugateList loops
258 //
259 doIt( newBegin ,
260 aEnd ,
261 iList ,
262 aLabel ,
263 aDecayList ) ;
264
265 iList.pop_back();
266
267 }
268 }
269 }
270 }
271} ;
272
273//
274// static data member definitions
275//
276
277//
278// constructors and destructor
279//
280
281//the copy constructor is only used for the return value of operator* so
282// we can make things faster by swapping the data stored in the vector
283template < class CandidateClass >
285 m_listOfLists( *(new _combinatoriclist_vector_() ) ),
286 m_listFilled( iRHS.m_listFilled ) ,
287 m_conjugationKnown( iRHS.m_conjugationKnown )
288{
289 m_listOfLists.swap(const_cast<CombinatoricList<CandidateClass>&>(iRHS).m_listOfLists);
290}
291
292template < class CandidateClass >
294 m_listOfLists( *(new _combinatoriclist_vector_( 1 ,
295 &aList ) ) ) ,
296 m_listFilled( false ) ,
297 m_conjugationKnown( false )
298{
299}
300
301template < class CandidateClass >
304 m_listOfLists( *(new _combinatoriclist_vector_( 1 ,
305 &lhs ) ) ) ,
306 m_listFilled( false ) ,
307 m_conjugationKnown( false )
308{
309 //std::cout << "@CombinatoricList::CombinatoricList() 11" << std::endl;
310 //typedef typename ConjugateList< CandidateClass >::const_partial_iterator test_it;
311 //std::cout << "lhs ...................... : " << std::endl;
312 //for ( test_it it = lhs.partial_begin(); it != lhs.partial_end(); it++ ) {
313 // std::cout << (*it)().footPrint() << std::endl;
314 //}
315 //std::cout << "rhs ...................... : " << std::endl;
316 //for ( test_it it = rhs.partial_begin(); it != rhs.partial_end(); it++ ) {
317 // std::cout << (*it)().footPrint() << std::endl;
318 //}
319 m_listOfLists.push_back( &rhs ) ;
320}
321
322template < class CandidateClass >
325 m_listOfLists( *(new _combinatoriclist_vector_( lhs.m_listOfLists ) ) ) ,
326 m_listFilled( false ) ,
327 m_conjugationKnown( false )
328{
329 m_listOfLists.push_back( &rhs ) ;
330}
331
332template < class CandidateClass >
335 m_listOfLists( *(new _combinatoriclist_vector_( 1 ,
336 &lhs ) ) ) ,
337 m_listFilled( false ) ,
338 m_conjugationKnown( false )
339{
340 m_listOfLists.insert( m_listOfLists.end() ,
341 (rhs.m_listOfLists).begin() ,
342 (rhs.m_listOfLists).end() ) ;
343}
344
345template < class CandidateClass >
348 m_listOfLists( *(new _combinatoriclist_vector_( lhs.m_listOfLists ) ) ) ,
349 m_listFilled( false ) ,
350 m_conjugationKnown( false )
351{
352 m_listOfLists.insert( m_listOfLists.end() ,
353 (rhs.m_listOfLists).begin() ,
354 (rhs.m_listOfLists).end() ) ;
355}
356
357template < class CandidateClass >
359{
360 delete &m_listOfLists ;
361}
362//*******************************************************************************
363 template <class CandidateClass>
364CombinatoricList< CandidateClass >& CombinatoricList< CandidateClass >::operator=( const CombinatoricList< CandidateClass >& another)/*: m_listFilled(another.m_listFilled), m_conjugationKnown(another.m_conjugationKnown), m_listOfLists(another.m_listOfLists)*/
365{
366 if( this != &another)
367 {
368 // std::cout<<"operator="<<std::endl;
369 // // std::cout<<"lv#"<<(this)<<", A#"<<(&m_listOfLists)<<std::endl;
370 // // std::cout<<"rv#"<<(&another)<<", A#"<<&(another.m_listOfLists)<<std::endl;
371 m_listOfLists.erase(m_listOfLists.begin(), m_listOfLists.end());
372 m_listOfLists.insert(m_listOfLists.end(),
373 another.m_listOfLists.begin(),
374 another.m_listOfLists.end());
375 //m_listOfLists = another.m_listOfLists ;
376 m_listFilled = another.m_listFilled;
377 m_conjugationKnown = another.m_conjugationKnown;
378 }
379 return *this;
380}
381
382//********************************************************************************
383//
384// assignment operators
385//
386// const CombinatoricList< CandidateClass >& CombinatoricList< CandidateClass >::operator=( const CombinatoricList< CandidateClass >& )
387// {
388// }
389
390//
391// member functions
392//
393
394 template < class CandidateClass >
400
401 template < class CandidateClass >
407
408 template < class CandidateClass >
410{
411 //std::cout << "@CombinatoricList::particle_begin() -- iterator" << std::endl;
412 fill() ;
414}
415
416template < class CandidateClass >
418 //std::cout << "@CombinatoricList::particle_end() -- iterator" << std::endl;
419 fill() ;
421}
422
423 template < class CandidateClass >
429
430//
431// const member functions
432//
433
434template < class CandidateClass >
437{
438 fill() ;
439 // Need to cast away 'const' to get the right type of LabelList returned
441 (*(CombinatoricList< CandidateClass >*)this).labeledParticleList() ,
442 otherLabel( label() ) ) ) ;
443}
444
445template < class CandidateClass >
448{
449 fill() ;
450 // // Need to cast away 'const' to get the right type of LabelList returned
451 // return ( dchain::DecayList< DecayClass , CandidateClass >( (*(CombinatoricList< CandidateClass >*)this).labeledDecayList() ,
452 // label() ) ) ;
453 return ( *this ) ;
454}
455
456template < class CandidateClass >
457bool
463
464template < class CandidateClass >
470
471template < class CandidateClass >
477
478template < class CandidateClass >
484
485template < class CandidateClass >
491
492template < class CandidateClass >
493typename dchain::DecayList< typename DCCandidateTraits<CandidateClass>::DecayClass , CandidateClass >::const_iterator
495{
496 //std::cout << "@CombinatoricList::particle_begin() -- iterator" << std::endl;
497 fill() ;
499}
500
501template < class CandidateClass >
502typename dchain::DecayList< typename DCCandidateTraits<CandidateClass>::DecayClass , CandidateClass >::const_iterator
504{
505 //std::cout << "@CombinatoricList::particle_end() -- const_iterator" << std::endl;
506 fill() ;
508}
509
510template < class CandidateClass >
511typename dchain::DecayList< typename DCCandidateTraits<CandidateClass>::DecayClass , CandidateClass >::const_partial_iterator
517
518template < class CandidateClass >
519typename dchain::DecayList< typename DCCandidateTraits<CandidateClass>::DecayClass , CandidateClass >::const_partial_iterator
525
526
527template < class CandidateClass >
533
534template < class CandidateClass >
540
541template < class CandidateClass >
543{
544 if ( m_conjugationKnown ) {
545 return ;
546 }
547 _combinatoriclist_vector_ unConjugatedLists ;
548 typename _combinatoriclist_vector_::const_iterator finishedTesting ( m_listOfLists.end() ) ;
549 for ( typename _combinatoriclist_vector_::const_iterator list( m_listOfLists.begin() ) ;
550 list != finishedTesting ;
551 ++list ) {
552 if ( ! (*(*list)).isSelfConjugate() ) {
553 bool noMatchFound( !false ) ;
554 typename _combinatoriclist_vector_::iterator matchToCheck( unConjugatedLists.begin() ) ;
555 typename _combinatoriclist_vector_::iterator finishedMatching ( unConjugatedLists.end() ) ;
556 while ( noMatchFound &&
557 ( matchToCheck != finishedMatching ) ) {
558 if ( (*(*list)).isConjugateOf( (*(*matchToCheck)) ) ) {
559 unConjugatedLists.erase( matchToCheck ) ;
560 noMatchFound = false ;
561 }
562 ++matchToCheck ;
563 }
564 if ( noMatchFound ) {
565 unConjugatedLists.push_back( *list ) ;
566 }
567 }
568 }
569 if ( 0 == unConjugatedLists.size() ) {
570 // have to cast away 'const' to set the real value of the label
571 (*(CombinatoricList< CandidateClass >*)this).setLabel( conjugation::kNone ) ;
572 }
573 else {
574 // have to cast away 'const' to set the real value of the label
575 (*(CombinatoricList< CandidateClass >*)this).setLabel( kBaseLabel ) ;
576 }
577 // have to cast away 'const' to set the real value of the flag
578 (*(CombinatoricList< CandidateClass >*)this).m_conjugationKnown = !false ;
579}
580
581template < class CandidateClass >
582void CombinatoricList< CandidateClass >::fill() const
583{
584 //std::cout << "@CombinatoricList::fill(), filled = " << m_listFilled << std::endl;
585 if ( m_listFilled ) {
586 return ;
587 }
588 //
589 // Create CombinatoricLoop lists for `primary' half of the list.
590 // If list is not self-conjugate, fill CombinatoricLoop lists for `conjugate'
591 // half of the list as well.
592 //
593 const short kPrimary = 0 ;
594 const short kConjugate = 1 ;
595 const short kEndLoopType = 2 ;
596 _combinatoricloop_vector_ loopList[ 2 ] ;
597 typename _combinatoricloop_vector_::iterator initialLoop[ 2 ] ;
598 typename _combinatoricloop_vector_::iterator secondLoop[ 2 ] ;
599 typename _combinatoricloop_vector_::iterator endLoop[ 2 ] ;
600 for ( short loopType( kPrimary ) ;
601 loopType != kEndLoopType ;
602 ++loopType ) {
603 if ( ( kConjugate != loopType ) ||
604 ( ! isSelfConjugate() ) ) {
605 loopList[ loopType ].reserve( m_listOfLists.size() ) ;
606 typename _combinatoriclist_vector_::const_iterator finishedBuilding( m_listOfLists.end() ) ;
607 for ( typename _combinatoriclist_vector_::const_iterator listForLoop( m_listOfLists.begin() ) ;
608 listForLoop != finishedBuilding ;
609 ++listForLoop ) {
610 CombinatoricLoop< CandidateClass >* newLoop ;
611 if ( kPrimary == loopType ) {
612 newLoop = new CombinatoricLoop< CandidateClass >( (*(*listForLoop)).partial_begin() ,
613 (*(*listForLoop)).partial_end() ,
614 loopList[ loopType ] ) ;
615 }
616 else {
617 newLoop = new CombinatoricLoop< CandidateClass >( (*(*listForLoop)).conjugate_partial_begin() ,
618 (*(*listForLoop)).conjugate_partial_end() ,
619 loopList[ loopType ] ) ;
620 }
621 loopList[ loopType ].push_back( newLoop ) ;
622 }
623 initialLoop[ loopType ] = loopList[ loopType ].begin() ;
624 secondLoop[ loopType ] = initialLoop[ loopType ] + 1 ;
625 endLoop[ loopType ] = loopList[ loopType ].end() ;
626 }
627 }
628 //
629 // do loop through initial ConjugateList
630 //
631 conjugation::Label conjugationLabel = kBaseLabel;
632 if( isSelfConjugate() ) {
633 conjugationLabel = conjugation::kNone;
634 }
635
637 *(*initialLoop[ kPrimary ]),
638 secondLoop[ kPrimary ] ,
639 endLoop[ kPrimary ] ,
640 conjugationLabel,
641 const_cast<CombinatoricList< CandidateClass >*>(this)->labeledParticleList() );
642
643 if( !isSelfConjugate() ) {
645 *(*initialLoop[ kConjugate ]),
646 secondLoop[ kConjugate ] ,
647 endLoop[ kConjugate ] ,
648 otherLabel(conjugationLabel),
649 const_cast<CombinatoricList< CandidateClass >*>(this)->labeledParticleList() );
650 }
651 /*
652#if defined(THIS_IS_NEVER_TRUE)
653conjugation::Label entryLabel[ 2 ] ;
654if ( ! isSelfConjugate() ) {
655entryLabel[ 0 ] = kBaseLabel ;
656entryLabel[ 1 ] = otherLabel( kBaseLabel ) ;
657}
658else {
659entryLabel[ 0 ] = conjugation::kNone ;
660}
661const ConjugateList< CandidateClass >& initialList( (*(*(m_listOfLists.begin()))) ) ;
662typename dchain::CandidateList< CandidateClass >::const_partial_iterator initialListEntry[ 2 ] ;
663initialListEntry[ kPrimary ] = initialList.partial_begin() ;
664if ( ! isSelfConjugate() ) {
665initialListEntry[ kConjugate ] = initialList.conjugate_partial_begin() ;
666}
667typename dchain::CandidateList< CandidateClass >::const_iterator finished( initialList.end() ) ;
668for ( typename dchain::CandidateList< CandidateClass >::const_iterator entry( initialList.begin() ) ;
669entry != finished ;
670++entry ) {
671 //
672 // if entry is in `primary' half of list build all decays for this
673 // entry, otherwise, if list is not self-conjugate build all decays
674 // for this `conjugate' entry
675 //
676 short entryType( kConjugate ) ;
677 if ( &(*entry) == &(*initialListEntry[ kPrimary ]) ) {
678 entryType = kPrimary ;
679 }
680 if ( ( kConjugate != entryType ) ||
681 ( ! isSelfConjugate() ) ) {
682 (*(*initialLoop[ entryType ])).setCurrentIterator( initialListEntry[ entryType ] ) ;
683 ReferenceHolder<DecayClass> initialDecay( new DecayClass( (*initialListEntry[ entryType ]).labeledClass() ) );
684//
685// Note: need to cast way `const' to make sure a non-const LabeledParticleList
686// is returned
687//
688typename FillDecayList<DecayClass, CandidateClass>::ChildList childList(initialDecay.pointer());
689
690FillDecayList< DecayClass , CandidateClass >::
691doIt( secondLoop[ entryType ] ,
692endLoop[ entryType ] ,
693childList,
694entryLabel[ entryType ] ,
695(*(CombinatoricList< CandidateClass >*)this).labeledParticleList()
696//this->labeledParticleList()
697) ;
698++initialListEntry[ entryType ] ;
699}
700}
701#endif
702*/
703//
704// delete contents of CombinatoricLoop lists.
705//
706for ( short halfType( kPrimary ) ;
707 halfType != kEndLoopType ;
708 ++halfType ) {
709 if ( ( kConjugate != halfType ) ||
710 ( ! isSelfConjugate() ) ) {
711 typename _combinatoricloop_vector_::iterator finishedDeletion( loopList[ halfType ].end() ) ;
712 for ( typename _combinatoricloop_vector_::iterator loopInList( loopList[ halfType ].begin() ) ;
713 loopInList != finishedDeletion ;
714 ++loopInList ) {
715 delete *loopInList ;
716 }
717 }
718}
719m_listFilled = !false ;
720}
721
722//
723// static member functions
724//
725}
726#endif /* DCHAIN_COMBINATORICLIST_CC */
727
728
729
730
#define _combinatoriclist_vector_
#define _combinatoricloop_vector_
const Int_t n
void fill(NTuple::Array< double > &nt_p4, const HepLorentzVector &p4)
Definition MyUtil.cxx:3
virtual dchain::DecayList< DecayClass, CandidateClass >::iterator particle_end()
virtual const dchain::DecayList< DecayClass, CandidateClass > bar() const
virtual const_partial_iterator partial_particle_end() const
virtual dchain::DecayList< DecayClass, CandidateClass >::iterator particle_begin()
CombinatoricList< CandidateClass > & operator=(const CombinatoricList< CandidateClass > &aOtherList)
virtual dchain::CandidateList< CandidateClass >::iterator end()
virtual const_partial_iterator partial_particle_begin() const
virtual bool isSelfConjugate() const
virtual dchain::CandidateList< CandidateClass >::iterator begin()
virtual dchain::LabeledCandidateList< CandidateClass > & labeledCandidateList()
virtual dchain::CandidateList< CandidateClass >::const_partial_iterator partial_end() const
virtual const dchain::DecayList< DecayClass, CandidateClass > & operator()() const
virtual conjugation::Label label() const
virtual dchain::CandidateList< CandidateClass >::const_partial_iterator partial_begin() const
const dchain::CandidateList< CandidateClass >::const_partial_iterator partial_end() const
const dchain::CandidateList< CandidateClass >::const_partial_iterator partial_begin() const
void setCurrentIterator(typename dchain::CandidateList< CandidateClass >::const_partial_iterator &aIterator)
ChildList(const DecayClass *decay)
void push_back(const CandidateClass *iCandidate)
bool overlap(const CandidateClass &iCandidate) const
static void fill(CombinatoricLoop< CandidateClass > &iLoop, const typename _combinatoricloop_vector_::iterator &aBegin, const typename _combinatoricloop_vector_::iterator &aEnd, const conjugation::Label aLabel, dchain::LabeledParticleList< DecayClass, CandidateClass > &aDecayList)
static void doIt(const typename _combinatoricloop_vector_::iterator &aBegin, const typename _combinatoricloop_vector_::iterator &aEnd, ChildList &iList, const conjugation::Label aLabel, dchain::LabeledParticleList< DecayClass, CandidateClass > &aDecayList)
void push_back(const LabeledParticle< ParticleClass > &aEntry)
conjugation::Label otherLabel(const conjugation::Label &aLabel)
Definition conjugation.h:51