9 #include "CLHEP/Random/RandomEngine.h"
31 return StatusCode::SUCCESS;
35 return StatusCode::SUCCESS;
40 const EventContext& ctx = Gaudi::Hive::currentContext();
43 ATH_MSG_ERROR(
"Failed to retrieve random number engine xAODM4MuIntervalFilter");
44 setFilterPassed(
false);
45 return StatusCode::FAILURE;
49 std::vector<HepMC::FourVector> MCTruthMuonList;
55 ATH_MSG_ERROR(
"No TruthParticle collection with name " <<
"TruthGen" <<
" found in StoreGate!");
56 return StatusCode::FAILURE;
59 unsigned int nPart = xTruthParticleContainer->
size();
60 for (
unsigned int iPart = 0; iPart < nPart; ++iPart) {
67 HepMC::FourVector
tmp((pitr)->
px(), (pitr)->
py(), (pitr)->
pz(), (pitr)->
e());
68 MCTruthMuonList.push_back(
tmp);
74 std::sort(MCTruthMuonList.begin(), MCTruthMuonList.end(), High2LowByPt());
76 if(MCTruthMuonList.size()<4){
77 setFilterPassed(
false);
78 ATH_MSG_DEBUG(
"Less than 4 muons. The muon number is " << MCTruthMuonList.size());
79 return StatusCode::SUCCESS;
83 HepMC::FourVector vec4mu(MCTruthMuonList.at(0).px() + MCTruthMuonList.at(1).px() + MCTruthMuonList.at(2).px() + MCTruthMuonList.at(3).px(),
84 MCTruthMuonList.at(0).py() + MCTruthMuonList.at(1).py() + MCTruthMuonList.at(2).py() + MCTruthMuonList.at(3).py(),
85 MCTruthMuonList.at(0).pz() + MCTruthMuonList.at(1).pz() + MCTruthMuonList.at(2).pz() + MCTruthMuonList.at(3).pz(),
86 MCTruthMuonList.at(0).e() + MCTruthMuonList.at(1).e() + MCTruthMuonList.at(2).e() + MCTruthMuonList.at(3).e() );
88 double m4mu = vec4mu.m();
89 double eventWeight = 1.0;
91 double rnd = rndm->flat();
92 if (1.0/eventWeight < rnd) {
93 setFilterPassed(
false);
94 ATH_MSG_DEBUG(
"Event failed weighting. Weight is " << eventWeight);
95 return StatusCode::SUCCESS;
101 setFilterPassed(
false);
102 ATH_MSG_ERROR(
"Could not retrieve MC Event Collection - weight might not work");
103 return StatusCode::FAILURE;
106 ATH_MSG_INFO(
"Event passed. Will weight events " << eventWeight);
108 for (
unsigned int i = 0;
i < mec->
size(); ++
i) {
109 if (!(*mec)[
i])
continue;
110 double existingWeight = (*mec)[
i]->weights().
size()>0 ? (*mec)[
i]->weights()[0] : 1.;
111 if ((*mec)[
i]->weights().size()>0) {
112 for (
unsigned int iw = 0; iw < (*mec)[
i]->weights().size(); ++iw) {
113 double existWeight = (*mec)[
i]->weights()[iw];
114 (*mec)[
i]->weights()[iw] = existWeight*eventWeight;
118 (*mec)[
i]->weights().push_back( eventWeight*existingWeight );
122 (*mec)[
i]->add_attribute(
"filterWeight", std::make_shared<HepMC3::DoubleAttribute>(eventWeight));
128 setFilterPassed(
true);
129 return StatusCode::SUCCESS;
149 const EventContext& ctx)
const
153 rngWrapper->
setSeed( rngName, ctx );