35 #include "GaudiKernel/MsgStream.h"
42 #include "CLHEP/Vector/LorentzVector.h"
44 #include "TLorentzVector.h"
116 return StatusCode::SUCCESS;
122 return StatusCode::SUCCESS;
145 primx = vprim -> position().x();
146 primy = vprim -> position().y();
148 ATH_MSG_DEBUG(
"MuDstarFilter: PV x, y = " << primx <<
" , " << primy);
153 std::vector < HepMC::ConstGenParticlePtr > Muons;
156 const HepMC::GenEvent * genEvt = ( * itr);
157 for (
const auto & pitr: * genEvt) {
167 Muons.push_back(pitr);
174 if (NumMuons == 0)
break;
175 for (
const auto & pitr: * genEvt) {
180 if (std::abs(pitr -> pdg_id()) == MC::DSTAR) {
186 if (!(pitr -> end_vertex()))
continue;
188 double Rxy = std::sqrt(
pow(pitr -> end_vertex() -> position().
x() - primx, 2) +
pow(pitr -> end_vertex() -> position().
y() - primy, 2));
196 auto firstChild = pitr -> end_vertex() -> particles_out().begin();
197 auto endChild = pitr -> end_vertex() -> particles_out().end();
198 auto thisChild = firstChild;
200 HepMC::GenVertex::particle_iterator firstChild =
202 HepMC::GenVertex::particle_iterator endChild =
204 HepMC::GenVertex::particle_iterator thisChild = firstChild;
207 if (( * firstChild) -> pdg_id() == pitr -> pdg_id())
continue;
210 TLorentzVector p4_pi;
211 TLorentzVector p4_pis;
212 TLorentzVector p4_D0;
213 TLorentzVector p4_Dstar;
214 TLorentzVector p4_Mu;
215 TLorentzVector p4_DstarMu;
223 for (; thisChild != endChild; ++thisChild) {
227 if (std::abs(( * thisChild) -> pdg_id()) == MC::PIPLUS) {
234 pis_pdg = ( * thisChild) -> pdg_id();
241 if (NumPis != 1)
continue;
248 int NumChildD0Charged = 0;
249 int NumChildD0neutrinos = 0;
250 int NumChildD0gammas = 0;
251 int ChargeD0Child1 = 0;
252 int ChargeD0Child2 = 0;
254 int NumChildD0pi = 0;
255 int NumChildD0mu = 0;
257 for (thisChild = firstChild; thisChild != endChild; ++thisChild) {
261 if (std::abs(( * thisChild) -> pdg_id()) == MC::D0) {
262 if ((( * thisChild) -> end_vertex())) {
264 auto firstChild1 = ( * thisChild) -> end_vertex() -> particles_out().begin();
265 auto endChild1 = ( * thisChild) -> end_vertex() -> particles_out().end();
266 auto thisChild1 = firstChild1;
268 HepMC::GenVertex::particle_iterator firstChild1 =
270 HepMC::GenVertex::particle_iterator endChild1 =
272 HepMC::GenVertex::particle_iterator thisChild1 = firstChild1;
276 for (; thisChild1 != endChild1; ++thisChild1) {
280 if (std::abs(( * thisChild1) -> pdg_id()) == MC::ELECTRON || std::abs(( * thisChild1) -> pdg_id()) ==
MC::MUON ||
281 std::abs(( * thisChild1) -> pdg_id()) == MC::PIPLUS || std::abs(( * thisChild1) -> pdg_id()) == MC::KPLUS) {
290 if (NumChildD0Charged == 1) {
291 D0Child1 = ( * thisChild1);
292 if (( * thisChild1) -> pdg_id() == -MC::ELECTRON || ( * thisChild1) -> pdg_id() == -
MC::MUON ||
293 ( * thisChild1) -> pdg_id() == MC::PIPLUS || ( * thisChild1) -> pdg_id() == MC::KPLUS) {
299 if (NumChildD0Charged == 2) {
300 D0Child2 = ( * thisChild1);
301 if (( * thisChild1) -> pdg_id() == -MC::ELECTRON || ( * thisChild1) -> pdg_id() == -
MC::MUON ||
302 ( * thisChild1) -> pdg_id() == MC::PIPLUS || ( * thisChild1) -> pdg_id() == MC::KPLUS) {
308 if (std::abs(( * thisChild1) -> pdg_id()) ==
MC::MUON) {
310 D0ChildMu = ( * thisChild1);
312 if (std::abs(( * thisChild1) -> pdg_id()) == MC::PIPLUS) ++NumChildD0pi;
313 if (std::abs(( * thisChild1) -> pdg_id()) == MC::KPLUS) {
315 K_pdg = ( * thisChild1) -> pdg_id();
319 }
else if (std::abs(( * thisChild1) -> pdg_id()) == MC::PI0) {
321 }
else if (std::abs(( * thisChild1) -> pdg_id()) == MC::NU_E || std::abs(( * thisChild1) -> pdg_id()) == MC::NU_MU) {
322 ++NumChildD0neutrinos;
323 }
else if (std::abs(( * thisChild1) -> pdg_id()) == MC::PHOTON) {
325 }
else if (std::abs(( * thisChild1) -> pdg_id()) == MC::K0 || std::abs(( * thisChild1) -> pdg_id()) == MC::K0L ||
326 std::abs(( * thisChild1) -> pdg_id()) == MC::K0S) {
329 }
else if ((( * thisChild1) -> end_vertex())) {
333 auto firstChild2 = ( * thisChild1) -> end_vertex() -> particles_out().begin();
334 auto endChild2 = ( * thisChild1) -> end_vertex() -> particles_out().end();
335 auto thisChild2 = firstChild2;
337 HepMC::GenVertex::particle_iterator firstChild2 =
339 HepMC::GenVertex::particle_iterator endChild2 =
341 HepMC::GenVertex::particle_iterator thisChild2 = firstChild2;
344 for (; thisChild2 != endChild2; ++thisChild2) {
348 if (std::abs(( * thisChild2) -> pdg_id()) == MC::ELECTRON || std::abs(( * thisChild2) -> pdg_id()) ==
MC::MUON ||
349 std::abs(( * thisChild2) -> pdg_id()) == MC::PIPLUS || std::abs(( * thisChild2) -> pdg_id()) == MC::KPLUS) {
358 if (NumChildD0Charged == 1) {
359 D0Child1 = ( * thisChild2);
360 if (( * thisChild2) -> pdg_id() == -MC::ELECTRON || ( * thisChild2) -> pdg_id() == -
MC::MUON ||
361 ( * thisChild2) -> pdg_id() == MC::PIPLUS || ( * thisChild2) -> pdg_id() == MC::KPLUS) {
367 if (NumChildD0Charged == 2) {
368 D0Child2 = ( * thisChild2);
369 if (( * thisChild2) -> pdg_id() == -MC::ELECTRON || ( * thisChild2) -> pdg_id() == -
MC::MUON ||
370 ( * thisChild2) -> pdg_id() == MC::PIPLUS || ( * thisChild2) -> pdg_id() == MC::KPLUS) {
376 if (std::abs(( * thisChild2) -> pdg_id()) ==
MC::MUON) {
378 D0ChildMu = ( * thisChild2);
382 }
else if (std::abs(( * thisChild2) -> pdg_id()) == MC::PI0) {
384 }
else if (std::abs(( * thisChild2) -> pdg_id()) == MC::NU_E || std::abs(( * thisChild2) -> pdg_id()) == MC::NU_MU) {
385 ++NumChildD0neutrinos;
386 }
else if (std::abs(( * thisChild2) -> pdg_id()) == MC::PHOTON) {
388 }
else if (std::abs(( * thisChild2) -> pdg_id()) == MC::K0 || std::abs(( * thisChild2) -> pdg_id()) == MC::K0L ||
389 std::abs(( * thisChild2) -> pdg_id()) == MC::K0S) {
392 }
else if ((( * thisChild2) -> end_vertex())) {
398 ATH_MSG_DEBUG(
"MuDstarFilter: unexpected D0 granddaughter = " << (*thisChild2)->pdg_id() );
405 ATH_MSG_DEBUG(
"MuDstarFilter: unexpected D0 daughter = " << (*thisChild1)->pdg_id() );
409 ATH_MSG_DEBUG(
"MuDstarFilter: NumChildD0, NumChildD0Charged = " << NumChildD0 <<
" , " << NumChildD0Charged);
411 if (NumChildD0 <= 3 && NumChildD0Charged == 2 && ChargeD0Child1 * ChargeD0Child2 < 0) {
413 if (NumChildD0 == 2 && NumChildD0K == 1 && NumChildD0pi == 1) ++NumD0;
425 if (pis_pdg * ChargeD0Child1 < 0) {
436 p4_D0 = p4_K + p4_pi;
437 double mKpi = p4_D0.M();
443 p4_Dstar = p4_D0 + p4_pis;
445 double delta_m = p4_Dstar.M() - mKpi;
454 for (
size_t i = 0;
i < Muons.size(); ++
i) {
456 if (NumChildD0mu == 1) {
458 if (std::fabs(Muons[
i] ->
momentum().
perp() - D0ChildMu ->
momentum().
perp())< std::numeric_limits<double>::epsilon())
continue;
459 ATH_MSG_DEBUG(
"MuDstarFilter: Mu(pT), D0Mu(pT) = " << Muons[
i]->
momentum().
perp() <<
" , " << D0ChildMu->momentum().perp() ) ;
464 p4_DstarMu = p4_Dstar + p4_Mu;
466 ATH_MSG_DEBUG(
"MuDstarFilter: p4_DstarMu.M() = " << p4_DstarMu.M());
470 ATH_MSG_INFO(
"MuDstarFilter: MuDstar candidate found" );
471 ATH_MSG_INFO(
"MuDstarFilter: p4_DstarMu.M() = " << p4_DstarMu.M() );
472 ATH_MSG_INFO(
"MuDstarFilter: NumChildD0, NumChildD0Charged = " << NumChildD0 <<
" , " << NumChildD0Charged );
473 ATH_MSG_INFO(
"MuDstarFilter: NumChildD0K, NumChildD0pi, NumChildD0mu = " << NumChildD0K <<
" , " << NumChildD0pi <<
" , " << NumChildD0mu );
475 if (NumChildD0mu == 1) {
480 ATH_MSG_INFO(
"MuDstarFilter: NumChildD0neutrinos, NumChildD0gammas = " << NumChildD0neutrinos <<
" , " << NumChildD0gammas );
481 ATH_MSG_INFO(
"MuDstarFilter: pis_pdg, K_pdg, ChargeD0Child1, ChargeD0Child2 = " << pis_pdg <<
" , " << K_pdg <<
" , " << ChargeD0Child1 <<
" , " << ChargeD0Child2 );
483 setFilterPassed(
true);
484 return StatusCode::SUCCESS;
500 setFilterPassed(
false);
501 return StatusCode::SUCCESS;