00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_ParticleTraits_H
00010 #define ThePEG_ParticleTraits_H
00011
00012
00013 #include "ThePEG/Config/ThePEG.h"
00014
00015
00016
00017 namespace ThePEG {
00018
00019 template <typename PType>
00033 struct ParticleTraits: public TraitsType {
00034
00038 static PType & ref(PType & p) {
00039 return p;
00040 }
00041
00045 static LorentzMomentum momentum(const PType & p) {
00046 return p.momentum();
00047 }
00048
00052 static Energy mass(const PType & p) {
00053 return p.mass();
00054 }
00055
00059 static void transform(PType & p, const LorentzRotation & r) {
00060 p.transform(r);
00061 }
00062
00066 static void set5Momentum(PType & p, const Lorentz5Momentum & q) {
00067 p.set5Momentum(q);
00068 }
00069
00074 static void set3Momentum(PType & p, const Momentum3 & q) {
00075 p.set3Momentum(q);
00076 }
00077
00081 static int iCharge(const PType & p) {
00082 return p.data().iCharge();
00083 }
00084
00085 };
00086
00090 template <>
00091 struct ParticleTraits<PPtr>: public TraitsType {
00092
00096 static Particle & ref(tPPtr p) {
00097 return *p;
00098 }
00099
00103 static const LorentzMomentum & momentum(tPPtr p) {
00104 return p->momentum();
00105 }
00106
00110 static Energy mass(tPPtr p) {
00111 return p->mass();
00112 }
00113
00117 static void transform(tPPtr p, const LorentzRotation & r) {
00118 p->transform(r);
00119 }
00120
00124 static void set5Momentum(tPPtr p, const Lorentz5Momentum & q) {
00125 p->set5Momentum(q);
00126 }
00127
00132 static void set3Momentum(tPPtr p, const Momentum3 & q) {
00133 p->set3Momentum(q);
00134 }
00135
00139 static int iCharge(tPPtr p) {
00140 return p->data().iCharge();
00141 }
00142 };
00143
00145 template <>
00146 struct ParticleTraits<cPPtr>: public TraitsType {
00147
00151 static const Particle & ref(tcPPtr p) {
00152 return *p;
00153 }
00154
00158 static const LorentzMomentum & momentum(tcPPtr & p) {
00159 return p->momentum();
00160 }
00161
00165 static Energy mass(tcPPtr p) {
00166 return p->mass();
00167 }
00168
00172 static int iCharge(tcPPtr & p) {
00173 return p->data().iCharge();
00174 }
00175 };
00176
00178 template <>
00179 struct ParticleTraits<tPPtr>: public TraitsType {
00180
00184 static Particle & ref(tPPtr p) {
00185 return *p;
00186 }
00187
00191 static const LorentzMomentum & momentum(tPPtr p) {
00192 return p->momentum();
00193 }
00194
00198 static Energy mass(tPPtr p) {
00199 return p->mass();
00200 }
00201
00205 static void transform(tPPtr p, const LorentzRotation & r) {
00206 p->transform(r);
00207 }
00208
00212 static void set5Momentum(tPPtr p, const Lorentz5Momentum & q) {
00213 p->set5Momentum(q);
00214 }
00215
00220 static void set3Momentum(tPPtr p, const Momentum3 & q) {
00221 p->set3Momentum(q);
00222 }
00223
00227 static int iCharge(tPPtr p) {
00228 return p->data().iCharge();
00229 }
00230 };
00231
00233 template <>
00234 struct ParticleTraits<tcPPtr>: public TraitsType {
00235
00239 static const Particle & ref(tcPPtr p) {
00240 return *p;
00241 }
00242
00246 static const LorentzMomentum & momentum(tcPPtr p) {
00247 return p->momentum();
00248 }
00249
00253 static Energy mass(tcPPtr p) {
00254 return p->mass();
00255 }
00256
00260 static int iCharge(tcPPtr p) {
00261 return p->data().iCharge();
00262 }
00263 };
00264
00266 template <typename T>
00267 struct ParticleTraits<T*>: public TraitsType {
00268
00272 static Particle & ref(T * p) {
00273 return *p;
00274 }
00275
00279 static const LorentzMomentum & momentum(T * p) {
00280 return ParticleTraits<T>::momentum(*p);
00281 }
00282
00286 static Energy mass(T * p) {
00287 return ParticleTraits<T>::mass(*p);
00288 }
00289
00293 static void transform(T * p, const LorentzRotation & r) {
00294 ParticleTraits<T>::transform(*p, r);
00295 }
00296
00300 static void set5Momentum(T * p, const Lorentz5Momentum & q) {
00301 ParticleTraits<T>::set5Momentum(*p, q);
00302 }
00303
00308 static void set3Momentum(T * p, const Momentum3 & q) {
00309 ParticleTraits<T>::set3Momentum(*p, q);
00310 }
00311
00315 static int iCharge(T * p) {
00316 return ParticleTraits<T>::iCharge(*p);
00317 }
00318 };
00319
00322 template <typename T>
00323 struct ParticleTraits<const T *>: public TraitsType {
00324
00328 static const Particle & ref(const T * p) {
00329 return *p;
00330 }
00331
00335 static const LorentzMomentum & momentum(const T * p) {
00336 return ParticleTraits<T>::momentum(*p);
00337 }
00338
00342 static Energy mass(const T * p) {
00343 return ParticleTraits<T>::mass(*p);
00344 }
00345
00349 static int iCharge(const T * p) {
00350 return ParticleTraits<T>::iCharge(*p);
00351 }
00352 };
00353
00357 template <>
00358 struct ParticleTraits<LorentzMomentum>: public TraitsType {
00359
00363 static LorentzMomentum & ref(LorentzMomentum & p) {
00364 return p;
00365 }
00366
00370 static const LorentzMomentum & momentum(const LorentzMomentum & p) {
00371 return p;
00372 }
00373
00377 static Energy mass(const LorentzMomentum & p) {
00378 return p.m();
00379 }
00380
00384 static void transform(LorentzMomentum & p, const LorentzRotation & r) {
00385 p.transform(r);
00386 }
00387
00391 static void set5Momentum(LorentzMomentum & p, const Lorentz5Momentum & q) {
00392 p = q;
00393 }
00394
00399 static void set3Momentum(LorentzMomentum & p, const Momentum3 & q) {
00400 p = LorentzMomentum(q, sqrt(q.mag2() + p.m2()));
00401 }
00402 };
00403
00407 template <>
00408 struct ParticleTraits<Lorentz5Momentum>: public TraitsType {
00409
00413 static Lorentz5Momentum & ref(Lorentz5Momentum & p) {
00414 return p;
00415 }
00416
00420 static const LorentzMomentum & momentum(const Lorentz5Momentum & p) {
00421 return p;
00422 }
00423
00427 static Energy mass(const Lorentz5Momentum & p) {
00428 return p.mass();
00429 }
00430
00434 static void transform(Lorentz5Momentum & p, const LorentzRotation & r) {
00435 p.transform(r);
00436 }
00437
00441 static void set5Momentum(Lorentz5Momentum & p, const Lorentz5Momentum & q) {
00442 p = q;
00443 }
00444
00449 static void set3Momentum(Lorentz5Momentum & p, const Momentum3 & q) {
00450 p = Lorentz5Momentum(p.mass(), q);
00451 }
00452 };
00453
00458 struct Transformer {
00461 Transformer(const LorentzRotation & rin) : r(rin) {}
00463 Transformer(const Transformer & t) : r(t.r) {}
00465 template <typename PType>
00466 void operator()(const PType & p) {
00467 ParticleTraits<PType>::transform(p, r);
00468 }
00470 const LorentzRotation & r;
00471 };
00472
00473 }
00474
00475
00476 #ifndef ThePEG_TEMPLATES_IN_CC_FILE
00477
00478 #endif
00479
00480 #endif