Go to the documentation of this file.00001 #include <map>
00002
00003 #include <boost/shared_ptr.hpp>
00004
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 #include "GeneratorInterface/LHEInterface/interface/LHEEvent.h"
00008 #include "GeneratorInterface/LHEInterface/interface/Hadronisation.h"
00009 #include "GeneratorInterface/LHEInterface/interface/BranchingRatios.h"
00010
00011 namespace lhef {
00012
00013 void BranchingRatios::reset()
00014 {
00015 cache.clear();
00016 }
00017
00018 void BranchingRatios::set(int pdgId, bool both, double value)
00019 {
00020 cache[pdgId] = value;
00021 if (both)
00022 cache[-pdgId] = value;
00023 }
00024
00025 double BranchingRatios::getFactor(
00026 const Hadronisation *hadronisation,
00027 const boost::shared_ptr<LHEEvent> &event) const
00028 {
00029 double factor = 1.0;
00030 const HEPEUP *hepeup = event->getHEPEUP();
00031 for(int i = 0; i < hepeup->NUP; i++) {
00032 if (hepeup->ISTUP[i] == 1)
00033 factor *= get(hepeup->IDUP[i], hadronisation);
00034 }
00035 return factor;
00036 }
00037
00038 double BranchingRatios::get(int pdgId,
00039 const Hadronisation *hadronisation) const
00040 {
00041 std::map<int, double>::const_iterator pos = cache.find(pdgId);
00042 if (pos == cache.end()) {
00043 double val = hadronisation->totalBranchingRatio(pdgId);
00044 if (val <= 0.0)
00045 val = 1.0;
00046 if (val < 0.99)
00047 edm::LogInfo("Generator|LHEInterface")
00048 << "Particle with pdgId " << pdgId
00049 << " only partly decayed in hadronizer, "
00050 "reducing respective event cross-section "
00051 "contribution with a factor of "
00052 << val << "." << std::endl;
00053
00054 cache.insert(std::make_pair(pdgId, val));
00055 return val;
00056 } else
00057 return pos->second;
00058 }
00059
00060 }