Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Validation/EventGenerator/interface/DuplicationChecker.h"
00011
00012 using namespace edm;
00013
00014 DuplicationChecker::DuplicationChecker(const edm::ParameterSet& iPSet):
00015 _wmanager(iPSet),
00016 generatedCollection_(iPSet.getParameter<edm::InputTag>("hepmcCollection")),
00017 searchForLHE_(iPSet.getParameter<bool>("searchForLHE"))
00018 {
00019 dbe = 0;
00020 dbe = edm::Service<DQMStore>().operator->();
00021
00022 xBjorkenHistory.clear();
00023 }
00024
00025 DuplicationChecker::~DuplicationChecker()
00026 {
00027 xBjorkenHistory.clear();
00028 }
00029
00030 void DuplicationChecker::beginJob()
00031 {
00032 if(dbe){
00034 dbe->setCurrentFolder("Generator/DuplicationCheck");
00035
00037 xBjorkenME = dbe->book1D("xBjorkenME", "x Bjorken ratio", 1000000, 0., 1.);
00038 }
00039 }
00040
00041 void DuplicationChecker::analyze(const edm::Event& iEvent,const edm::EventSetup& iSetup)
00042 {
00043
00044 double bjorken = 0;
00045
00046 double weight = _wmanager.weight(iEvent);
00047
00048 if (searchForLHE_) {
00049
00050 Handle<LHEEventProduct> evt;
00051 iEvent.getByType( evt );
00052
00053 const lhef::HEPEUP hepeup_ = evt->hepeup();
00054
00055 const std::vector<lhef::HEPEUP::FiveVector> pup_ = hepeup_.PUP;
00056
00057 double pz1=(pup_[0])[3];
00058 double pz2=(pup_[1])[3];
00059 bjorken+=(pz1/(pz1+pz2));
00060 }
00061 else {
00062
00063 edm::Handle<HepMCProduct> evt;
00064 iEvent.getByLabel(generatedCollection_, evt);
00065
00066 const HepMC::PdfInfo *pdf = evt->GetEvent()->pdf_info();
00067 if(pdf){
00068 bjorken = ((pdf->x1())/((pdf->x1())+(pdf->x2())));
00069 }
00070
00071 }
00072
00073 xBjorkenHistory.insert(std::pair<double,edm::EventID>(bjorken,iEvent.id()));
00074
00075 xBjorkenME->Fill(bjorken,weight);
00076
00077 }
00078
00079 void DuplicationChecker::findValuesAssociatedWithKey(associationMap &mMap, double &key, itemList &theObjects)
00080 {
00081 associationMap::iterator itr;
00082 associationMap::iterator lastElement;
00083
00084 theObjects.clear();
00085
00086
00087 itr = mMap.find(key);
00088 if (itr == mMap.end())
00089 return;
00090
00091
00092 lastElement = mMap.upper_bound(key);
00093
00094
00095 for ( ; itr != lastElement; ++itr)
00096 theObjects.push_back(itr);
00097 }
00098
00099 void DuplicationChecker::endJob()
00100 {
00101
00102 itemList theObjects;
00103 theObjects.reserve(10);
00104
00105 for (associationMap::iterator it = xBjorkenHistory.begin(); it != xBjorkenHistory.end(); it++) {
00106 double theKey = (*it).first;
00107
00108 findValuesAssociatedWithKey(xBjorkenHistory, theKey, theObjects);
00109
00110 if (theObjects.size() > 1) {
00111 edm::LogWarning("DuplicatedEventFound") << "Duplicated events found with xBjorken = " << std::fixed << std::setw(16) << std::setprecision(14) << theKey;
00112 for (unsigned int i = 0; i < theObjects.size(); i++) {
00113 edm::LogPrint("DuplicatedEventList") << "Event = " << (*theObjects[i]).second;
00114 }
00115 }
00116
00117 theObjects.clear();
00118
00119 }
00120
00121 }