00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef THEPEG_RemnantDecayer_H
00010 #define THEPEG_RemnantDecayer_H
00011
00012
00013
00014
00015 #include "ThePEG/PDT/Decayer.h"
00016 #include "RemnantDecayer.fh"
00017 #include "ThePEG/PDT/RemnantData.h"
00018 #include "ThePEG/EventRecord/RemnantParticle.h"
00019 #include "ThePEG/Handlers/PtGenerator.h"
00020
00021 namespace ThePEG {
00022
00034 class RemnantDecayer: public Decayer {
00035
00036 public:
00037
00039 typedef Ptr<PtGenerator>::pointer PtGPtr;
00040
00041 public:
00042
00047 enum RecoilOption {
00048 boostAll,
00049 boostFinal,
00050 copyFinal
00051 };
00052
00053 public:
00054
00060 RemnantDecayer() : respectDIS(2), theRecoilOption(copyFinal) {}
00061
00065 virtual ~RemnantDecayer();
00067
00068 public:
00069
00078 virtual bool accept(const DecayMode & dm) const;
00079
00087 virtual bool needsFullStep() const;
00088
00102 virtual ParticleVector decay(const DecayMode & dm, const Particle & p,
00103 Step & step) const = 0;
00104
00111 virtual ParticleVector decay(const DecayMode & dm, const Particle & p) const;
00113
00118 virtual bool canHandle(tcPDPtr parent, tcPDPtr extracted) const;
00119
00126 virtual bool checkExtract(tcPPtr parent, tcPPtr extracted,
00127 const LorentzMomentum & pnew) const;
00128
00133 virtual bool multiCapable() const;
00134
00139 RecoilOption recoilOption() const { return theRecoilOption; }
00140
00146 int respectDISKinematics() const { return respectDIS; }
00147
00152 PtGPtr pTGenerator() const { return thePTGenerator; }
00153
00161 static tPVector decayRemnants(const tPVector & particles, Step & step);
00162
00163 protected:
00164
00168 tRemPDPtr data(tcRemPPtr remnant) const { return remnant->remData; }
00169
00173 tcPPtr parent(tcRemPPtr remnant) const { return remnant->parent; }
00174
00178 const PVector & extracted(tcRemPPtr remnant) const {
00179 return remnant->extracted();
00180 }
00181
00185 virtual void fillSubSystem(tPPtr p, set<tPPtr> & sub) const;
00186
00194 virtual tPVector getSubSystem(tcPPtr parent, tPPtr parton) const;
00195
00204 static LorentzRotation getZBoost(const LorentzMomentum & p0,
00205 const LorentzMomentum & p);
00206
00207 public:
00208
00212 struct SubSystemFail: public Exception {};
00213
00214 protected:
00215
00223 virtual void doinit();
00224
00229 virtual bool preInitialize() const;
00231
00232 public:
00233
00240 void persistentOutput(PersistentOStream & os) const;
00241
00247 void persistentInput(PersistentIStream & is, int version);
00249
00256 static void Init();
00257
00258 protected:
00264 mutable int respectDIS;
00265
00266 private:
00267
00272 RecoilOption theRecoilOption;
00273
00278 PtGPtr thePTGenerator;
00279
00280 private:
00281
00286 static AbstractClassDescription<RemnantDecayer> initRemnantDecayer;
00287
00292 RemnantDecayer & operator=(const RemnantDecayer &);
00293
00294 };
00295
00296 }
00297
00298 #include "ThePEG/Utilities/ClassTraits.h"
00299
00300 namespace ThePEG {
00301
00306 template <>
00307 struct BaseClassTrait<RemnantDecayer,1> {
00309 typedef Decayer NthBase;
00310 };
00311
00314 template <>
00315 struct ClassTraits<RemnantDecayer>
00316 : public ClassTraitsBase<RemnantDecayer> {
00318 static string className() { return "ThePEG::RemnantDecayer"; }
00319 };
00320
00323 }
00324
00325 #endif