ZFinder.cc
Go to the documentation of this file.
00001 // -*- C++ -*- 00002 #include "Rivet/Projections/ZFinder.hh" 00003 #include "Rivet/Projections/InvMassFinalState.hh" 00004 #include "Rivet/Projections/LeptonClusters.hh" 00005 #include "Rivet/Projections/VetoedFinalState.hh" 00006 #include "Rivet/Tools/ParticleIdUtils.hh" 00007 #include "Rivet/Tools/Logging.hh" 00008 #include "Rivet/Cmp.hh" 00009 00010 namespace Rivet { 00011 00012 00013 ZFinder::ZFinder(const FinalState& inputfs, 00014 double etaMin, double etaMax, 00015 double pTmin, 00016 PdgId pid, 00017 double minmass, double maxmass, 00018 double dRmax, bool clusterPhotons, bool trackPhotons, 00019 double masstarget) { 00020 vector<pair<double, double> > etaRanges; 00021 etaRanges += std::make_pair(etaMin, etaMax); 00022 _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget); 00023 } 00024 00025 00026 ZFinder::ZFinder(const FinalState& inputfs, 00027 const std::vector<std::pair<double, double> >& etaRanges, 00028 double pTmin, 00029 PdgId pid, 00030 double minmass, const double maxmass, 00031 double dRmax, bool clusterPhotons, bool trackPhotons, 00032 double masstarget) { 00033 _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget); 00034 } 00035 00036 00037 ZFinder::ZFinder(double etaMin, double etaMax, 00038 double pTmin, 00039 PdgId pid, 00040 double minmass, double maxmass, 00041 double dRmax, bool clusterPhotons, bool trackPhotons, 00042 double masstarget) { 00043 vector<pair<double, double> > etaRanges; 00044 etaRanges += std::make_pair(etaMin, etaMax); 00045 FinalState inputfs; 00046 _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget); 00047 } 00048 00049 00050 ZFinder::ZFinder(const std::vector<std::pair<double, double> >& etaRanges, 00051 double pTmin, 00052 PdgId pid, 00053 double minmass, const double maxmass, 00054 double dRmax, bool clusterPhotons, bool trackPhotons, 00055 double masstarget) { 00056 FinalState inputfs; 00057 _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget); 00058 } 00059 void ZFinder::_init(const FinalState& inputfs, 00060 const std::vector<std::pair<double, double> >& etaRanges, 00061 double pTmin, PdgId pid, 00062 double minmass, double maxmass, 00063 double dRmax, bool clusterPhotons, bool trackPhotons, 00064 double masstarget) 00065 { 00066 setName("ZFinder"); 00067 00068 _minmass = minmass; 00069 _maxmass = maxmass; 00070 _masstarget = masstarget; 00071 _pid = pid; 00072 _trackPhotons = trackPhotons; 00073 00074 IdentifiedFinalState bareleptons(inputfs); 00075 bareleptons.acceptIdPair(pid); 00076 LeptonClusters leptons(inputfs, bareleptons, dRmax, 00077 clusterPhotons, 00078 etaRanges, pTmin); 00079 addProjection(leptons, "LeptonClusters"); 00080 00081 VetoedFinalState remainingFS; 00082 remainingFS.addVetoOnThisFinalState(*this); 00083 addProjection(remainingFS, "RFS"); 00084 } 00085 00086 00087 ///////////////////////////////////////////////////// 00088 00089 00090 const FinalState& ZFinder::remainingFinalState() const 00091 { 00092 return getProjection<FinalState>("RFS"); 00093 } 00094 00095 00096 int ZFinder::compare(const Projection& p) const { 00097 PCmp LCcmp = mkNamedPCmp(p, "LeptonClusters"); 00098 if (LCcmp != EQUIVALENT) return LCcmp; 00099 00100 const ZFinder& other = dynamic_cast<const ZFinder&>(p); 00101 return (cmp(_minmass, other._minmass) || cmp(_maxmass, other._maxmass) || 00102 cmp(_pid, other._pid) || cmp(_trackPhotons, other._trackPhotons)); 00103 } 00104 00105 00106 void ZFinder::project(const Event& e) { 00107 clear(); 00108 00109 const LeptonClusters& leptons = applyProjection<LeptonClusters>(e, "LeptonClusters"); 00110 00111 InvMassFinalState imfs(std::make_pair(_pid, -_pid), _minmass, _maxmass, _masstarget); 00112 Particles tmp; 00113 tmp.insert(tmp.end(), leptons.clusteredLeptons().begin(), leptons.clusteredLeptons().end()); 00114 imfs.calc(tmp); 00115 00116 if (imfs.particlePairs().size() < 1) return; 00117 ParticlePair Zconstituents(imfs.particlePairs()[0]); 00118 Particle l1(Zconstituents.first), l2(Zconstituents.second); 00119 if (PID::threeCharge(l1)>0.0) { 00120 _constituents += l1, l2; 00121 } 00122 else { 00123 _constituents += l2, l1; 00124 } 00125 FourMomentum pZ = l1.momentum() + l2.momentum(); 00126 const int z3charge = PID::threeCharge(l1.pdgId()) + PID::threeCharge(l2.pdgId()); 00127 assert(z3charge == 0); 00128 00129 stringstream msg; 00130 msg << "Z reconstructed from: \n" 00131 << " " << l1.momentum() << " " << l1.pdgId() << "\n" 00132 << " + " << l2.momentum() << " " << l2.pdgId(); 00133 MSG_DEBUG(msg.str()); 00134 _bosons.push_back(Particle(PID::ZBOSON, pZ)); 00135 00136 // Find the LeptonClusters which survived the IMFS cut such that we can 00137 // extract their original particles 00138 foreach (const Particle& p, _constituents) { 00139 foreach (const ClusteredLepton& l, leptons.clusteredLeptons()) { 00140 if (p.pdgId()==l.pdgId() && p.momentum()==l.momentum()) { 00141 _theParticles.push_back(l.constituentLepton()); 00142 if (_trackPhotons) { 00143 _theParticles.insert(_theParticles.end(), 00144 l.constituentPhotons().begin(), l.constituentPhotons().end()); 00145 } 00146 } 00147 } 00148 } 00149 } 00150 00151 00152 } Generated on Fri Apr 12 2013 16:00:12 for The Rivet MC analysis system by ![]() |