00001 #ifndef DCHAIN_COMBINATORICLIST_H
00002 #define DCHAIN_COMBINATORICLIST_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 template< class CandidateClass >
00036 class DCCandidateTraits {
00037 public:
00038 typedef typename CandidateClass::DecayEvidence DecayClass;
00039 };
00040
00041
00042
00043 #include "DecayChain/List/DecayList.h"
00044 #include "DecayChain/List/LabeledCandidateList.h"
00045
00046
00047
00048
00049 template < class Arg > class DCAnalysisFunction ;
00050
00051 #include <vector>
00052
00053 #ifndef _combinatoriclist_vector_
00054
00055
00056
00057
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
00090
00091
00092
00093
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
00102
00103
00104 friend class dchain::DecayList< DecayClass , CandidateClass > ;
00105
00106
00107
00108
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
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
00129 virtual ~CombinatoricList() ;
00130
00131
00132 CombinatoricList( const ConjugateList< CandidateClass >& aList ) ;
00133
00134 virtual conjugation::Label label() const ;
00135
00136
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
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
00180
00181 protected:
00182
00183
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
00199 virtual dchain::LabeledCandidateList< CandidateClass >& labeledCandidateList() ;
00200
00201
00202 virtual const dchain::LabeledCandidateList< CandidateClass >& labeledCandidateList() const ;
00203
00204 private:
00205
00206 CombinatoricList( void ) ;
00207
00208 public:
00209 CombinatoricList(
00210 const CombinatoricList< CandidateClass >& aOtherList ) ;
00211
00212 private:
00213
00214
00215
00216
00217 const CombinatoricList< CandidateClass >& operator=(
00218 const CombinatoricList< CandidateClass >& aOtherList ) ;
00219
00220
00221
00222
00223
00224 void determineConjugation() const ;
00225 void fill() const ;
00226
00227
00228 _combinatoriclist_vector_& m_listOfLists ;
00229 mutable bool m_listFilled ;
00230 bool m_conjugationKnown ;
00231
00232
00233
00234 } ;
00235
00236
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
00276 # include "DecayChain/List/Template/CombinatoricList.cc"
00277
00278 #endif