herwig is hosted by Hepforge, IPPP Durham
Herwig++  2.7.0
QTildeReconstructor.h
00001 // -*- C++ -*-
00002 //
00003 // QTildeReconstructor.h is a part of Herwig++ - A multi-purpose Monte Carlo event generator
00004 // Copyright (C) 2002-2011 The Herwig Collaboration
00005 //
00006 // Herwig++ is licenced under version 2 of the GPL, see COPYING for details.
00007 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
00008 //
00009 #ifndef HERWIG_QTildeReconstructor_H
00010 #define HERWIG_QTildeReconstructor_H
00011 //
00012 // This is the declaration of the QTildeReconstructor class.
00013 //
00014 
00015 #include "Herwig++/Shower/Base/KinematicsReconstructor.h"
00016 
00017 namespace Herwig {
00018 
00019 using namespace ThePEG;
00020 
00025 struct JetKinStruct {
00026 
00030   tShowerParticlePtr parent;
00031 
00035   Lorentz5Momentum p;
00036 
00040   Lorentz5Momentum q;
00041 };
00042 
00046 typedef vector<JetKinStruct> JetKinVect;
00047 
00073 class QTildeReconstructor: public KinematicsReconstructor {
00074 
00075 public:
00076 
00080   QTildeReconstructor() : _reconopt(0), _initialBoost(0), _minQ(MeV) {};
00081 
00094   virtual bool reconstructHardJets(ShowerTreePtr hard,
00095                                    const map<tShowerProgenitorPtr,
00096                                    pair<Energy,double> > & pt) const;
00097 
00106   virtual bool reconstructDecayJets(ShowerTreePtr decay) const;
00108 
00122   virtual bool deconstructDecayJets(HardTreePtr, cEvolverPtr,
00123                                     ShowerInteraction::Type) const;
00124 
00130   virtual bool deconstructHardJets(HardTreePtr, cEvolverPtr,
00131                                    ShowerInteraction::Type) const;
00133 
00134 public:
00135 
00142   void persistentOutput(PersistentOStream & os) const;
00143 
00149   void persistentInput(PersistentIStream & is, int version);
00151 
00158   static void Init();
00159 
00160 protected:
00161 
00179   virtual bool reconstructTimeLikeJet(const tShowerParticlePtr particleJetParent,
00180                                       unsigned int iopt) const;
00181 
00190   bool reconstructSpaceLikeJet(const tShowerParticlePtr particleJetParent) const;
00191 
00196   bool reconstructDecayJet(const tShowerParticlePtr particleJetParent) const;
00198 
00208   void reconstructInitialFinalSystem(vector<ShowerProgenitorPtr>) const;
00209 
00214   void reconstructFinalStateSystem(bool applyBoost, 
00215                                    const LorentzRotation & toRest,
00216                                    const LorentzRotation & fromRest, 
00217                                    vector<ShowerProgenitorPtr>) const;
00218 
00222   void reconstructGeneralSystem(vector<ShowerProgenitorPtr> & ShowerHardJets) const;
00223 
00228   void reconstructInitialInitialSystem(bool & applyBoost,
00229                                        LorentzRotation & toRest,
00230                                        LorentzRotation & fromRest,
00231                                        vector<ShowerProgenitorPtr>) const;
00233 
00243   void deconstructFinalStateSystem(const LorentzRotation & toRest,
00244                                    const LorentzRotation & fromRest,
00245                                    HardTreePtr,
00246                                    vector<HardBranchingPtr>,
00247                                    cEvolverPtr,
00248                                    ShowerInteraction::Type) const;
00249   
00254   void deconstructInitialInitialSystem(bool & applyBoost,
00255                                        LorentzRotation & toRest,
00256                                        LorentzRotation & fromRest,
00257                                        HardTreePtr,
00258                                        vector<HardBranchingPtr>,
00259                                        ShowerInteraction::Type ) const;
00260 
00265   void deconstructInitialFinalSystem(HardTreePtr,
00266                                      vector<HardBranchingPtr>,
00267                                      cEvolverPtr,
00268                                      ShowerInteraction::Type ) const;
00269 
00270   bool deconstructGeneralSystem(HardTreePtr, cEvolverPtr,
00271                                 ShowerInteraction::Type) const;
00273 
00282   LorentzRotation solveBoost(const double k, 
00283                              const Lorentz5Momentum & newq, 
00284                              const Lorentz5Momentum & oldp) const;
00285   
00289   LorentzRotation solveBoost(const Lorentz5Momentum & newq, 
00290                              const Lorentz5Momentum & oldq) const;
00291   
00295   LorentzRotation solveBoostZ(const Lorentz5Momentum & newq, 
00296                               const Lorentz5Momentum & oldq) const;
00297   
00304   void boostChain(tPPtr p, const LorentzRotation & bv, tPPtr & parent) const;
00305 
00314   Boost solveBoostBeta( const double k, const Lorentz5Momentum & newq, 
00315                           const Lorentz5Momentum & oldp);
00316 
00321   double getBeta(const double E, const double q, 
00322                  const double Ep, const double qp) const
00323   {return (q*E-qp*Ep)/(sqr(qp)+sqr(E));}
00325 
00341   double solveKfactor( const Energy & root_s, const JetKinVect & jets ) const;
00342 
00357   bool solveDecayKFactor(Energy mb, 
00358                          const Lorentz5Momentum & n, 
00359                          const Lorentz5Momentum & pjet, 
00360                          const JetKinVect & jetKinematics, 
00361                          ShowerParticlePtr partner,
00362                          Lorentz5Momentum ppartner[2],
00363                          double & k1, 
00364                          double & k2,
00365                          Lorentz5Momentum & qt) const;
00366 
00373   double inverseRescalingFactor(vector<Lorentz5Momentum> pout,
00374                                 vector<Energy> mon,Energy roots) const;
00375 
00386   bool inverseDecayRescalingFactor(vector<Lorentz5Momentum> pout,
00387                                    vector<Energy> mon,Energy roots,
00388                                    Lorentz5Momentum ppartner, Energy mbar,
00389                                    double & k1, double & k2) const;
00390 
00397   Energy momConsEq(const double & k, const Energy & root_s,
00398                           const JetKinVect & jets) const;
00400 
00405   vector<unsigned int> findPartners(unsigned int ,vector<ShowerProgenitorPtr>) const;
00406 
00411   void findPartners(HardBranchingPtr branch,set<HardBranchingPtr> & done,
00412                     const set<HardBranchingPtr> & branchings,
00413                     vector<HardBranchingPtr> & jets) const;
00414 
00418   bool addIntrinsicPt(vector<ShowerProgenitorPtr>) const;
00419 
00428   void deepTransform(PPtr particle,const LorentzRotation & r,
00429                      bool match=true,PPtr original=PPtr()) const;
00430 
00431 protected:
00432 
00439   virtual IBPtr clone() const {return new_ptr(*this);}
00440 
00445   virtual IBPtr fullclone() const {return new_ptr(*this);}
00447 
00448 protected:
00449 
00457   virtual void doinit();
00459 
00460 private:
00461 
00466   QTildeReconstructor & operator=(const QTildeReconstructor &);
00467 
00468 private:
00469 
00473   unsigned int _reconopt;
00474 
00478   unsigned int _initialBoost;
00479 
00484   Energy _minQ;
00485 
00489   mutable tShowerParticlePtr _progenitor;
00490 
00494   mutable map<tShowerProgenitorPtr,pair<Energy,double> > _intrinsic;
00495 
00499   mutable tShowerTreePtr _currentTree;
00500 
00505   PDVector _noRescaleVector;
00506 
00511   set<cPDPtr> _noRescale;
00512 };
00513 
00514 }
00515 
00516 #endif /* HERWIG_QTildeReconstructor_H */