10 #include "CLHEP/Random/RandomEngine.h"
16 bool operator () (HepMC::FourVector
t1, HepMC::FourVector
t2) {
17 return (
t1.perp() >
t2.perp());
50 return StatusCode::SUCCESS;
54 return StatusCode::SUCCESS;
59 const EventContext& ctx = Gaudi::Hive::currentContext();
62 ATH_MSG_ERROR(
"Failed to retrieve random number engine M4MuIntervalFilter");
63 setFilterPassed(
false);
64 return StatusCode::FAILURE;
68 std::vector<HepMC::FourVector> MCTruthMuonList;
71 const HepMC::GenEvent* genEvt = (*itr);
72 for (
const auto& pitr: *genEvt){
79 MCTruthMuonList.push_back(
tmp);
84 std::sort(MCTruthMuonList.begin(), MCTruthMuonList.end(), High2LowByPt());
86 if(MCTruthMuonList.size()<4){
87 setFilterPassed(
false);
88 ATH_MSG_DEBUG(
"Less than 4 muons. The muon number is " << MCTruthMuonList.size());
89 return StatusCode::SUCCESS;
93 HepMC::FourVector vec4mu(MCTruthMuonList.at(0).px() + MCTruthMuonList.at(1).px() + MCTruthMuonList.at(2).px() + MCTruthMuonList.at(3).px(),
94 MCTruthMuonList.at(0).py() + MCTruthMuonList.at(1).py() + MCTruthMuonList.at(2).py() + MCTruthMuonList.at(3).py(),
95 MCTruthMuonList.at(0).pz() + MCTruthMuonList.at(1).pz() + MCTruthMuonList.at(2).pz() + MCTruthMuonList.at(3).pz(),
96 MCTruthMuonList.at(0).e() + MCTruthMuonList.at(1).e() + MCTruthMuonList.at(2).e() + MCTruthMuonList.at(3).e() );
98 double m4mu = vec4mu.m();
99 double eventWeight = 1.0;
101 double rnd = rndm->flat();
102 if (1.0/eventWeight < rnd) {
103 setFilterPassed(
false);
104 ATH_MSG_DEBUG(
"Event failed weighting. Weight is " << eventWeight);
105 return StatusCode::SUCCESS;
111 setFilterPassed(
false);
112 ATH_MSG_ERROR(
"Could not retrieve MC Event Collection - weight might not work");
113 return StatusCode::FAILURE;
116 ATH_MSG_INFO(
"Event passed. Will weight events " << eventWeight);
118 for (
unsigned int i = 0;
i < mec->
size(); ++
i) {
119 if (!(*mec)[
i])
continue;
120 double existingWeight = (*mec)[
i]->weights().
size()>0 ? (*mec)[
i]->weights()[0] : 1.;
121 if ((*mec)[
i]->weights().size()>0) {
122 (*mec)[
i]->weights()[0] = existingWeight*eventWeight;
124 (*mec)[
i]->weights().push_back( eventWeight*existingWeight );
129 setFilterPassed(
true);
130 return StatusCode::SUCCESS;
151 const EventContext& ctx)
const
155 rngWrapper->
setSeed( rngName, ctx );