rivet is hosted by Hepforge, IPPP Durham
WFinder.hh
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #ifndef RIVET_WFinder_HH
00003 #define RIVET_WFinder_HH
00004 
00005 #include "Rivet/Projections/FinalState.hh"
00006 #include "Rivet/Projections/MissingMomentum.hh"
00007 #include "Rivet/Projections/VetoedFinalState.hh"
00008 
00009 namespace Rivet {
00010 
00011 
00012   /// @brief Convenience finder of leptonically decaying W
00013   ///
00014   /// Chain together different projections as convenience for finding one W
00015   /// from one lepton and the missing E 4-vector in the final state, including photon clustering.
00016   ///
00017   /// @todo Inherit directly from ParticleFinder, not FinalState
00018   class WFinder : public FinalState {
00019   public:
00020 
00021     enum ClusterPhotons { NOCLUSTER=0, CLUSTERNODECAY=1, CLUSTERALL };
00022     enum PhotonTracking { NOTRACK=0, TRACK=1 };
00023     enum MassWindow { MASS=0, TRANSMASS=1 };
00024 
00025     /// @name Constructors
00026     //@{
00027 
00028     /// Constructor taking cuts object
00029     /// @param inputfs Input final state
00030     /// @param leptoncuts Charged lepton cuts
00031     /// @param pid Type of the charged lepton
00032     /// @param minmass,maxmass (Transverse) mass window
00033     /// @param missingET Minimal amount of missing ET (neutrinos) required
00034     /// @param dRmax Maximum dR of photons around charged lepton to take into account
00035     ///  for W reconstruction (only relevant if one of the following are true)
00036     /// @param clusterPhotons Whether such photons are supposed to be
00037     ///  clustered to the lepton object and thus W mom
00038     /// @param trackPhotons Whether such photons should be added to _theParticles
00039     /// @param masstype Whether mass window should be applied using m or mT
00040     WFinder(const FinalState& inputfs,
00041             const Cut& leptoncuts,
00042             PdgId pid,
00043             double minmass, double maxmass,
00044             double missingET,
00045             double dRmax=0.1,
00046             ClusterPhotons clusterPhotons=CLUSTERNODECAY,
00047             PhotonTracking trackPhotons=NOTRACK,
00048             MassWindow masstype=MASS,
00049             double masstarget=80.4*GeV);
00050 
00051     /// Clone on the heap.
00052     virtual const Projection* clone() const {
00053       return new WFinder(*this);
00054     }
00055 
00056     //@}
00057 
00058 
00059     /// Access to the found bosons
00060     ///
00061     /// @note Currently either 0 or 1 boson can be found.
00062     const Particles& bosons() const { return _bosons; }
00063 
00064     /// Access to the found boson (assuming it exists)
00065     const Particle& boson() const { return _bosons[0]; }
00066 
00067 
00068     /// Access to the Ws' constituent clustered leptons
00069     ///
00070     /// @note Either size 0 if no boson was found or 1 if one boson was found
00071     const Particles& constituentLeptons() const { return _constituentLeptons; }
00072 
00073     /// Access to the W's constituent clustered lepton (assuming it exists)
00074     const Particle& constituentLepton() const { return _constituentLeptons[0]; }
00075 
00076 
00077     /// Access to the Ws' constituent neutrinos
00078     ///
00079     /// @note Either size 0 if no boson was found or 1 if one boson was found
00080     /// @note The neutrino can't be perfecly reconstructed -- this is a pseudo-nu from the MET.
00081     const Particles& constituentNeutrinos() const { return _constituentNeutrinos; }
00082 
00083     /// Access to the W's constituent neutrino (assuming it exists)
00084     /// @note The neutrino can't be perfecly reconstructed -- this is a pseudo-nu from the MET.
00085     const Particle& constituentNeutrino() const { return _constituentNeutrinos[0]; }
00086 
00087 
00088     /// Access to the particles other than the W leptons and clustered photons
00089     ///
00090     /// Useful for e.g. input to a jet finder
00091     const VetoedFinalState& remainingFinalState() const;
00092 
00093     /// Access to the missing momentum projection used to find the "neutrino"
00094     const MissingMomentum& missingMom() const;
00095 
00096     /// @brief Calculate the transverse mass of the W, from the charged lepton and neutrino
00097     ///
00098     /// Defined as sqrt(2 pT_l pT_nu (1.0 - cos(dphi_lnu))). Return -1 if no boson found.
00099     double mT() const {
00100       if (bosons().empty()) return -1;
00101       const FourMomentum& l = constituentLeptons()[0].momentum();
00102       const FourMomentum& nu = constituentNeutrinos()[0].momentum();
00103       return sqrt( 2 * l.pT() * nu.pT() * (1 - cos(deltaPhi(l, nu))) );
00104     }
00105 
00106 
00107   protected:
00108 
00109     /// Apply the projection on the supplied event.
00110     void project(const Event& e);
00111 
00112     /// Compare projections.
00113     int compare(const Projection& p) const;
00114 
00115 
00116   public:
00117 
00118     /// Clear the projection
00119     void clear() {
00120       _theParticles.clear();
00121       _bosons.clear();
00122       _constituentLeptons.clear();
00123       _constituentNeutrinos.clear();
00124     }
00125 
00126   private:
00127 
00128     /// Transverse mass cuts
00129     double _minmass, _maxmass, _masstarget;
00130     bool _useTransverseMass;
00131 
00132     /// Missing ET cut
00133     double _etMiss;
00134 
00135     /// Switch for tracking of photons (whether to add them to _theParticles)
00136     /// This is relevant when the ZFinder::_theParticles are to be excluded
00137     /// from e.g. the input to a jet finder, to specify whether the clustered
00138     /// photons are to be excluded as well.
00139     /// (Yes, some experiments make a difference between clusterPhotons and
00140     /// trackPhotons!)
00141     PhotonTracking _trackPhotons;
00142 
00143     /// Lepton flavour
00144     PdgId _pid;
00145 
00146     /// Neutrino flavour
00147     PdgId _nu_pid;
00148 
00149     /// list of found bosons (currently either 0 or 1)
00150     Particles _bosons;
00151 
00152     /// Constituent leptons (currently either 0 or 1)
00153     Particles _constituentLeptons;
00154 
00155     /// Constituent neutrinos (currently either 0 or 1)
00156     Particles _constituentNeutrinos;
00157 
00158   };
00159 
00160 
00161 }
00162 
00163 
00164 #endif