/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Event/DecayChain/DecayChain-00-00-03-slc6tag/DecayChain/List/CombinatoricList.h

Go to the documentation of this file.
00001 #ifndef DCHAIN_COMBINATORICLIST_H
00002 #define DCHAIN_COMBINATORICLIST_H
00003 // -*- C++ -*-
00004 //
00005 // Package:     DChain
00006 // Module:      CombinatoricList
00007 // 
00008 // Description: List to hold a ConjugateList of Candidates built
00009 //                from DecayClass Class.
00010 //
00011 // Usage:
00012 //    <usage>
00013 //
00014 // Author:      Simon Patton
00015 // Created:     Fri Oct  4 11:04:47 EDT 1996
00016 // $Id: CombinatoricList.h,v 1.1.1.1 2009/03/03 06:06:56 maqm Exp $
00017 //
00018 // Revision history
00019 //
00020 // $Log: CombinatoricList.h,v $
00021 // Revision 1.1.1.1  2009/03/03 06:06:56  maqm
00022 // first import of DecayChain
00023 //
00024 // Revision 1.2  2006/02/04 17:31:10  wsun
00025 // Made CombinatoricList::label() public instead of protected.
00026 //
00027 // Revision 1.1  2006/01/11 20:28:21  cdj
00028 // massive class renaming, addition of [] for selection and unit tests
00029 //
00030 //
00031 
00032 // system include files
00033 
00034 //...
00035 template< class CandidateClass >
00036 class DCCandidateTraits {
00037    public:
00038       typedef typename CandidateClass::DecayEvidence DecayClass;
00039 };
00040 
00041 // user include files
00042 
00043 #include "DecayChain/List/DecayList.h" // superclass declaration
00044 #include "DecayChain/List/LabeledCandidateList.h"
00045 
00046 // forward declarations
00047 //template< class DecayClass , class CandidateClass > class DCDecayList ; //for backwards compatibility
00048 
00049 template < class Arg > class DCAnalysisFunction ;
00050 
00051 #include <vector>
00052 
00053 #ifndef _combinatoriclist_vector_
00054 // The following CPP macro is used to avoid having to typedef
00055 // a map in the class.  Why? Because things can get messy, at
00056 // least in the g++ compiler as the typedef can cause instantiation
00057 // when not all the necessary information is available!
00058 #define _combinatoriclist_vector_ std::vector<const ConjugateList< CandidateClass >* >
00059 #endif
00060 
00061 namespace dchain {
00062 template< class CandidateClass> 
00063 class CombinatoricList;
00064 
00065 template< class CandidateClass> 
00066 class ConjugateList;
00067 
00068 template<  class CandidateClass>
00069 CombinatoricList< CandidateClass > operator*(
00070    const ConjugateList< CandidateClass >& lhs ,
00071    const ConjugateList< CandidateClass >& rhs ) ;
00072 
00073 template<  class CandidateClass>
00074 CombinatoricList< CandidateClass > operator*(
00075    const CombinatoricList< CandidateClass >& lhs ,
00076    const ConjugateList< CandidateClass >& rhs ) ;
00077 
00078 template<  class CandidateClass>
00079 CombinatoricList< CandidateClass > operator*(
00080    const ConjugateList< CandidateClass >& lhs ,
00081    const CombinatoricList< CandidateClass >& rhs ) ;
00082 
00083 template<  class CandidateClass>
00084 CombinatoricList< CandidateClass > operator*(
00085    const CombinatoricList< CandidateClass >& lhs ,
00086    const CombinatoricList< CandidateClass >& rhs ) ;
00087 
00088 //
00089 //  Note: To avoid a myriad of conpiler flags it is easier to
00090 //        have a two parameter template class.  The instantiation
00091 //        of this class must look like
00092 //
00093 //        template class CombinatoricList< A , A::CandidateClass > ;
00094 
00095 template < class CandidateClass >
00096 class CombinatoricList : public dchain::DecayList< typename DCCandidateTraits<CandidateClass>::DecayClass , CandidateClass >
00097 {
00098    public:
00099       typedef typename DCCandidateTraits<CandidateClass>::DecayClass DecayClass;
00100    private:
00101       // friend classses and functions
00102 // This class is a friend so that it can use the protected constructor
00103 //   that takes a ConjugateList as its argument
00104       friend class dchain::DecayList< DecayClass , CandidateClass > ;
00105       //friend class DCDecayList< DecayClass , CandidateClass > ; //for backwards compatibility
00106 
00107 // These are `friends' as these are the only way a CombinatoricList
00108 //   should be created, i.e. it need access to the private constructors
00109       friend CombinatoricList< CandidateClass > operator* <CandidateClass> (
00110          const ConjugateList< CandidateClass >& lhs ,
00111          const ConjugateList< CandidateClass >& rhs ) ;
00112       friend CombinatoricList< CandidateClass > operator* <CandidateClass> (
00113          const CombinatoricList< CandidateClass >& lhs ,
00114          const ConjugateList< CandidateClass >& rhs ) ;
00115       friend CombinatoricList< CandidateClass > operator* <CandidateClass> (
00116          const ConjugateList< CandidateClass >& lhs ,
00117          const CombinatoricList< CandidateClass >& rhs ) ;
00118       friend CombinatoricList< CandidateClass > operator* <CandidateClass> (
00119          const CombinatoricList< CandidateClass >& lhs ,
00120          const CombinatoricList< CandidateClass >& rhs ) ;
00121 
00122    public:
00123       // constants, enums and typedefs
00124       typedef typename dchain::DecayList< DecayClass , CandidateClass >::iterator iterator ;
00125       typedef typename dchain::DecayList< DecayClass , CandidateClass >::const_iterator const_iterator ;
00126       typedef typename dchain::DecayList< DecayClass , CandidateClass >::const_partial_iterator const_partial_iterator ;
00127 
00128       // Constructors and destructor
00129       virtual ~CombinatoricList() ;
00130 
00131       // used by Decay<> for single product DecayClass trees
00132       CombinatoricList( const ConjugateList< CandidateClass >& aList ) ;
00133 
00134       virtual conjugation::Label label() const ;
00135 
00136       // member functions
00137       virtual typename dchain::CandidateList< CandidateClass >::iterator begin() ;
00138       virtual typename dchain::CandidateList< CandidateClass >::iterator end() ;
00139       virtual typename dchain::DecayList< DecayClass , CandidateClass >::iterator particle_begin() ;
00140       virtual typename dchain::DecayList< DecayClass , CandidateClass >::iterator particle_end() ;
00141 
00142       // const member functions
00143       virtual const dchain::DecayList< DecayClass , CandidateClass > bar() const ;
00144       virtual const dchain::DecayList< DecayClass , CandidateClass >& operator()() const ;
00145       virtual bool isSelfConjugate() const ;
00146 
00147       virtual typename dchain::CandidateList< CandidateClass >::const_iterator begin() const ;
00148       virtual typename dchain::CandidateList< CandidateClass >::const_iterator end() const ;
00149       virtual typename dchain::CandidateList< CandidateClass >::const_partial_iterator
00150       partial_begin() const ;
00151       virtual typename dchain::CandidateList< CandidateClass >::const_partial_iterator
00152       partial_end() const ;
00153       virtual const_iterator particle_begin() const ;
00154       virtual const_iterator particle_end() const ;
00155       virtual const_partial_iterator partial_particle_begin() const ;
00156       virtual const_partial_iterator partial_particle_end() const ;
00157 
00158       using ConjugateList< CandidateClass >::iterate;
00159       template<class TAnalyze>
00160       void iterate( const TAnalyze& analyze) const {
00161          fill();
00162          dchain::DecayList<DecayClass,CandidateClass>::iterate(analyze);
00163       }
00164 
00165       template < class TAnalyzer>
00166       void conjugation_iterate( const TAnalyzer& analyze) const 
00167       {
00168          fill();
00169          dchain::DecayList<DecayClass,CandidateClass>::conjugation_iterate(analyze);
00170       }
00171 
00172       template<class TAnalyze>
00173       void partial_iterate( TAnalyze& analyze ) const
00174       {
00175          fill();
00176          dchain::DecayList<DecayClass,CandidateClass>::partial_iterate(analyze);
00177       }
00178 
00179       // static member functions
00180 
00181    protected:
00182       // Constructors and destructor
00183       // used by operator* functions to build up CombinatoricLists
00184       CombinatoricList(
00185          const ConjugateList< CandidateClass >& lhs ,
00186          const ConjugateList< CandidateClass >& rhs ) ;
00187       CombinatoricList(
00188          const CombinatoricList< CandidateClass >& lhs ,
00189          const ConjugateList< CandidateClass >& rhs ) ;
00190       CombinatoricList(
00191          const ConjugateList< CandidateClass >& lhs ,
00192          const CombinatoricList< CandidateClass >& rhs ) ;
00193       CombinatoricList(
00194          const CombinatoricList< CandidateClass >& lhs ,
00195          const CombinatoricList< CandidateClass >& rhs ) ;
00196 
00197    protected:
00198       // protected member functions
00199       virtual dchain::LabeledCandidateList< CandidateClass >& labeledCandidateList() ;
00200 
00201       // protected const member functions
00202       virtual const dchain::LabeledCandidateList< CandidateClass >& labeledCandidateList() const ;
00203 
00204    private:
00205       // Constructors and destructor
00206      CombinatoricList( void ) ; // stop default
00207 
00208    public:
00209      CombinatoricList(
00210         const CombinatoricList< CandidateClass >& aOtherList ) ;
00211 
00212    private:
00213 
00214       // stop default
00215 
00216       // assignment operator(s)
00217       const CombinatoricList< CandidateClass >& operator=(
00218          const CombinatoricList< CandidateClass >& aOtherList ) ;
00219       // stop default
00220 
00221       // private member functions
00222 
00223       // private const member functions
00224       void determineConjugation() const ;
00225       void fill() const ;
00226 
00227       // data members
00228       _combinatoriclist_vector_& m_listOfLists ;
00229       mutable bool m_listFilled ;
00230       bool m_conjugationKnown ;
00231 
00232       // static data members
00233 
00234 } ;
00235 
00236 // inline function definitions
00237 
00238 template<  class CandidateClass> 
00239 inline
00240 CombinatoricList< CandidateClass >
00241 operator*( const ConjugateList< CandidateClass >& lhs ,
00242            const ConjugateList< CandidateClass >& rhs ) 
00243 {
00244    return CombinatoricList<CandidateClass>( lhs, rhs); 
00245 }
00246 
00247 template<  class CandidateClass>
00248 inline 
00249 CombinatoricList< CandidateClass >
00250 operator*( const CombinatoricList< CandidateClass >& lhs ,
00251            const ConjugateList< CandidateClass >& rhs ) 
00252 {
00253    return CombinatoricList<CandidateClass>( lhs, rhs); 
00254 }
00255 
00256 template<  class CandidateClass> 
00257 inline
00258 CombinatoricList< CandidateClass >
00259 operator*( const ConjugateList< CandidateClass >& lhs ,
00260            const CombinatoricList< CandidateClass >& rhs ) 
00261 {
00262    return CombinatoricList<CandidateClass>( lhs, rhs);
00263 }
00264 
00265 template<  class CandidateClass> 
00266 inline
00267 CombinatoricList< CandidateClass >
00268 operator*( const CombinatoricList< CandidateClass >& lhs ,
00269            const CombinatoricList< CandidateClass >& rhs ) 
00270 {
00271    return CombinatoricList<CandidateClass>( lhs, rhs);
00272 }
00273 }
00274 
00275 // function definitions
00276 # include "DecayChain/List/Template/CombinatoricList.cc"
00277 
00278 #endif /* DCHAIN_COMBINATORICLIST_H */

Generated on Tue Nov 29 22:58:22 2016 for BOSS_7.0.2 by  doxygen 1.4.7