10 #include "CLHEP/Random/RandomEngine.h"
11 #include "GaudiKernel/PhysicalConstants.h"
18 return (
t1->pt() >
t2->pt());
61 return StatusCode::SUCCESS;
67 const EventContext& ctx = Gaudi::Hive::currentContext();
70 ATH_MSG_ERROR(
"Failed to retrieve random number engine VBFMjjIntervalFilter");
71 setFilterPassed(
false);
72 return StatusCode::SUCCESS;
79 !truthJetCollection ) {
81 setFilterPassed(
false);
82 return StatusCode::SUCCESS;
86 std::vector<HepMC::ConstGenParticlePtr> MCTruthPhotonList;
87 std::vector<HepMC::ConstGenParticlePtr> MCTruthElectronList;
88 std::vector<TLorentzVector> MCTruthTauList;
90 const HepMC::GenEvent* genEvt = (*itr);
91 for (
const auto& pitr: *genEvt) {
95 pitr->momentum().perp() >=
m_olapPt &&
96 std::abs(pitr->momentum().pseudoRapidity()) <=
m_yMax) {
97 MCTruthPhotonList.push_back(pitr);
103 pitr->momentum().perp() >=
m_olapPt &&
104 std::abs(pitr->momentum().pseudoRapidity()) <=
m_yMax) {
105 MCTruthElectronList.push_back(pitr);
113 for (
const auto&
beg: *(tau->end_vertex()) ) {
114 if (
beg->production_vertex() != tau->end_vertex() )
continue;
115 if ( std::abs(
beg->pdg_id() ) == 12 ) leptonic = 1;
116 if ( std::abs(
beg->pdg_id() ) == 14 ) leptonic = 2;
117 if ( std::abs(
beg->pdg_id() ) == 15 ) leptonic = 11;
122 TLorentzVector tauvis = TLorentzVector(tau->momentum().px()-nutau.Px(),
123 tau->momentum().py()-nutau.Py(),
124 tau->momentum().pz()-nutau.Pz(),
125 tau->momentum().e()-nutau.E());
126 if (tauvis.Vect().Perp() >=
m_olapPt && std::abs(tauvis.Vect().PseudoRapidity()) <=
m_yMax) {
127 MCTruthTauList.push_back(tauvis);
138 if (std::abs( (*jitr)->rapidity() ) <
m_yMax && (*jitr)->pt() >=
m_olapPt) {
139 bool JetOverlapsWithPhoton =
false;
140 bool JetOverlapsWithElectron =
false;
141 bool JetOverlapsWithTau =
false;
144 JetOverlapsWithPhoton =
checkOverlap((*jitr)->rapidity(), (*jitr)->phi(), MCTruthPhotonList);
147 JetOverlapsWithElectron =
checkOverlap((*jitr)->rapidity(), (*jitr)->phi(), MCTruthElectronList);
150 JetOverlapsWithTau =
checkOverlap((*jitr)->rapidity(), (*jitr)->phi(), MCTruthTauList);
153 if (!JetOverlapsWithPhoton && !JetOverlapsWithElectron && !JetOverlapsWithTau ) {
162 double eventWeight = 1.0;
164 double rnd = rndm->flat();
165 if (1.0/eventWeight < rnd) {
166 setFilterPassed(
false);
167 ATH_MSG_DEBUG(
"Event failed weighting. Weight is " << eventWeight);
168 return StatusCode::SUCCESS;
174 setFilterPassed(
false);
175 ATH_MSG_ERROR(
"Could not retrieve MC Event Collection - weight might not work");
176 return StatusCode::SUCCESS;
181 for (
unsigned int i = 0;
i < mec->
size(); ++
i) {
182 if (!(*mec)[
i])
continue;
183 double existingWeight = (*mec)[
i]->weights().
size()>0 ? (*mec)[
i]->weights()[0] : 1.;
184 if ((*mec)[
i]->weights().size()>0) {
185 (*mec)[
i]->weights()[0] = existingWeight*eventWeight*
m_norm;
187 (*mec)[
i]->weights().push_back( eventWeight*
m_norm*existingWeight );
195 setFilterPassed(
false);
197 return StatusCode::SUCCESS;
201 setFilterPassed(
false);
202 return StatusCode::SUCCESS;
206 setFilterPassed(
false);
207 return StatusCode::SUCCESS;
213 setFilterPassed(
true);
214 return StatusCode::SUCCESS;
219 for (
size_t i = 0;
i <
list.size(); ++
i) {
220 double pt =
list.at(
i)->momentum().perp();
223 double dphi =
phi-
list[
i]->momentum().phi();
224 double deta =
eta-
list[
i]->momentum().pseudoRapidity();
225 if (dphi >
M_PI) { dphi -= 2.*
M_PI; }
226 if (dphi < -
M_PI) { dphi += 2.*
M_PI; }
227 double dr = std::sqrt(deta*deta+dphi*dphi);
228 if (
dr < 0.3)
return true;
237 for (
size_t i = 0;
i <
list.size(); ++
i) {
238 double pt =
list[
i].Vect().Perp();
242 double deta =
eta-
list[
i].Vect().PseudoRapidity();
243 if (dphi >
M_PI) { dphi -= 2.*
M_PI; }
244 if (dphi < -
M_PI) { dphi += 2.*
M_PI; }
245 double dr = std::sqrt(deta*deta+dphi*dphi);
246 if (
dr < 0.3)
return true;
253 if(
jets->size()<2)
return false;
254 double mjj = (
jets->at(0)->p4() +
jets->at(1)->p4()).M();
255 double dphi = std::abs(
jets->at(0)->p4().DeltaPhi(
jets->at(1)->p4()));
267 if (
jets->size() == 0) {
270 }
else if (
jets->size() == 1) {
274 double mjj = (
jets->at(0)->p4() +
jets->at(1)->p4()).M();
299 TLorentzVector nu( 0, 0, 0, 0);
301 if ( ( std::abs(
part->pdg_id() ) == 12 ) || ( std::abs(
part->pdg_id() ) == 14 ) || ( std::abs(
part->pdg_id() ) == 16 ) ) {
302 nu.SetPx(
part->momentum().px());
303 nu.SetPy(
part->momentum().py());
304 nu.SetPz(
part->momentum().pz());
305 nu.SetE(
part->momentum().e());
309 if ( !
part->end_vertex() )
return nu;
317 const EventContext& ctx)
const
321 rngWrapper->
setSeed( rngName, ctx );