Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#include "GeneratorInterface/Pythia8Interface/test/analyserhepmc/JetInputHepMC.h"

JetInputHepMC::JetInputHepMC() : ptMin(0.0) {}

JetInputHepMC::~JetInputHepMC() {}

void JetInputHepMC::setIgnoredParticles(const std::vector<unsigned int> &particleIDs) {
  ignoreParticleIDs = particleIDs;
  std::sort(ignoreParticleIDs.begin(), ignoreParticleIDs.end());
}

static inline bool isContained(const std::vector<unsigned int> &list, int id) {
  unsigned int absId = (unsigned int)(id > 0 ? id : -id);
  std::vector<unsigned int>::const_iterator pos = std::lower_bound(list.begin(), list.end(), absId);
  return pos != list.end() && *pos == absId;
}

bool JetInputHepMC::isIgnored(int pdgId) const { return isContained(ignoreParticleIDs, pdgId); }

JetInputHepMC::ParticleVector JetInputHepMC::operator()(const HepMC::GenEvent *event) const {
  ParticleVector particles;
  for (HepMC::GenEvent::particle_const_iterator iter = event->particles_begin(); iter != event->particles_end(); ++iter)
    particles.push_back(*iter);

  std::sort(particles.begin(), particles.end());
  unsigned int size = particles.size();

  ParticleBitmap selected(size, false);
  ParticleBitmap invalid(size, false);

  for (unsigned int i = 0; i < size; i++) {
    const HepMC::GenParticle *particle = particles[i];
    if (invalid[i])
      continue;
    if (particle->status() == 1)
      selected[i] = true;
  }

  ParticleVector result;
  for (unsigned int i = 0; i < size; i++) {
    const HepMC::GenParticle *particle = particles[i];
    if (!selected[i] || invalid[i])
      continue;

    //if (isIgnored(particle->pdg_id())) continue;

    if (particle->momentum().perp() >= ptMin)
      result.push_back(particle);
  }

  return result;
}