CMS 3D CMS Logo

Public Member Functions | Protected Member Functions | Private Attributes

FBaseSimEvent Class Reference

#include <FBaseSimEvent.h>

Inheritance diagram for FBaseSimEvent:
FSimEvent

List of all members.

Public Member Functions

void addChargedTrack (int id)
 Add an id in the vector of charged tracks id's.
void addParticles (const reco::GenParticleCollection &myGenParticles)
void addParticles (const HepMC::GenEvent &hev)
 Add the particles and their vertices to the list.
int addSimTrack (const RawParticle *p, int iv, int ig=-1, const HepMC::GenVertex *ev=0)
 Add a new track to the Event and to the various lists.
int addSimVertex (const XYZTLorentzVector &decayVertex, int im=-1, FSimVertexType::VertexType type=FSimVertexType::ANY)
 Add a new vertex to the Event and to the various lists.
int chargedTrack (int id) const
 return "reconstructed" charged tracks index.
void clear ()
 clear the FBaseSimEvent content before the next event
const HepMC::GenParticle * embdGenpart (int i) const
 return MC track with a given id
const SimTrackembdTrack (int i) const
 return embedded track with given id
const SimVertexembdVertex (int i) const
 return embedded vertex with given id
const FSimVertexTypeembdVertexType (int i) const
 return embedded vertex type with given id
 FBaseSimEvent (const edm::ParameterSet &vtx, const edm::ParameterSet &kine, const RandomEngine *engine)
 FBaseSimEvent (const edm::ParameterSet &kine)
 Default constructor.
void fill (const std::vector< SimTrack > &, const std::vector< SimVertex > &)
 fill the FBaseSimEvent from SimTrack's and SimVert'ices
void fill (const HepMC::GenEvent &hev)
 fill the FBaseSimEvent from the current HepMC::GenEvent
void fill (const reco::GenParticleCollection &hev)
 fill the FBaseSimEvent from the current reco::GenParticleCollection
const KineParticleFilterfilter () const
void initializePdt (const HepPDT::ParticleDataTable *aPdt)
 Initialize the particle data table.
unsigned int nChargedTracks () const
 Number of "reconstructed" charged tracks.
unsigned int nGenParts () const
 Number of generator particles.
unsigned int nTracks () const
 Number of tracks.
unsigned int nVertices () const
 Number of vertices.
void print () const
 print the FBaseSimEvent in an intelligible way
void printMCTruth (const HepMC::GenEvent &hev)
 print the original MCTruth event
void setBeamSpot (const math::XYZPoint &aBeamSpot)
 Set the beam spot position.
PrimaryVertexGeneratorthePrimaryVertexGenerator () const
const HepPDT::ParticleDataTabletheTable () const
 Get the pointer to the particle data table.
FSimTracktrack (int id) const
 Return track with given Id.
FSimVertexvertex (int id) const
 Return vertex with given Id.
FSimVertexTypevertexType (int id) const
 Return vertex with given Id.
 ~FBaseSimEvent ()
 usual virtual destructor

Protected Member Functions

std::vector
< HepMC::GenParticle * > * 
genparts () const
 The pointer to the vector of GenParticle's.
std::vector< FSimTrack > * tracks () const
 The pointer to the vector of FSimTrack's.
std::vector< FSimVertex > * vertices () const
 The pointer to the vector of FSimVertex's.

Private Attributes

unsigned int initialSize
double lateVertexPosition
KineParticleFiltermyFilter
 The particle filter.
unsigned int nChargedParticleTracks
unsigned int nGenParticles
unsigned int nSimTracks
unsigned int nSimVertices
const ParticleDataTablepdt
const RandomEnginerandom
double sigmaVerteX
double sigmaVerteY
double sigmaVerteZ
math::XYZPoint theBeamSpot
unsigned int theChargedSize
std::vector< unsigned > * theChargedTracks
FSimVertexTypeCollectiontheFSimVerticesType
std::vector
< HepMC::GenParticle * > * 
theGenParticles
unsigned int theGenSize
std::vector< FSimTrack > * theSimTracks
std::vector< FSimVertex > * theSimVertices
unsigned int theTrackSize
PrimaryVertexGeneratortheVertexGenerator
unsigned int theVertexSize

Detailed Description

Definition at line 45 of file FBaseSimEvent.h.


Constructor & Destructor Documentation

FBaseSimEvent::FBaseSimEvent ( const edm::ParameterSet kine)

Default constructor.

Definition at line 35 of file FBaseSimEvent.cc.

References initialSize, theBeamSpot, theChargedSize, theChargedTracks, theFSimVerticesType, theGenParticles, theGenSize, theSimTracks, theSimVertices, theTrackSize, theVertexGenerator, and theVertexSize.

  :
  nSimTracks(0),
  nSimVertices(0),
  nGenParticles(0),
  nChargedParticleTracks(0),
  initialSize(5000),
  random(0)
{

  theVertexGenerator = new NoPrimaryVertexGenerator();
  theBeamSpot = math::XYZPoint(0.0,0.0,0.0);

  // Initialize the vectors of particles and vertices
  theGenParticles = new std::vector<HepMC::GenParticle*>(); 
  theSimTracks = new std::vector<FSimTrack>;
  theSimVertices = new std::vector<FSimVertex>;
  theChargedTracks = new std::vector<unsigned>();
  theFSimVerticesType = new FSimVertexTypeCollection();

  // Reserve some size to avoid mutiple copies
  /* */
  theSimTracks->resize(initialSize);
  theSimVertices->resize(initialSize);
  theGenParticles->resize(initialSize);
  theChargedTracks->resize(initialSize);
  theFSimVerticesType->resize(initialSize);
  theTrackSize = initialSize;
  theVertexSize = initialSize;
  theGenSize = initialSize;
  theChargedSize = initialSize;
  /* */

  // Initialize the Particle filter
  myFilter = new KineParticleFilter(kine);

}
FBaseSimEvent::FBaseSimEvent ( const edm::ParameterSet vtx,
const edm::ParameterSet kine,
const RandomEngine engine 
)

Definition at line 73 of file FBaseSimEvent.cc.

References edm::ParameterSet::getParameter(), initialSize, lateVertexPosition, random, theBeamSpot, theChargedSize, theChargedTracks, theFSimVerticesType, theGenParticles, theGenSize, theSimTracks, theSimVertices, theTrackSize, theVertexGenerator, and theVertexSize.

  :
  nSimTracks(0),
  nSimVertices(0),
  nGenParticles(0),
  nChargedParticleTracks(0), 
  initialSize(5000),
  theVertexGenerator(0), 
  random(engine)
{

  // Initialize the vertex generator
  std::string vtxType = vtx.getParameter<std::string>("type");
  if ( vtxType == "Gaussian" ) 
    theVertexGenerator = new GaussianPrimaryVertexGenerator(vtx,random);
  else if ( vtxType == "Flat" ) 
    theVertexGenerator = new FlatPrimaryVertexGenerator(vtx,random);
  else if ( vtxType == "BetaFunc" )
    theVertexGenerator = new BetaFuncPrimaryVertexGenerator(vtx,random);
  else
    theVertexGenerator = new NoPrimaryVertexGenerator();
  // Initialize the beam spot, if not read from the DataBase
  theBeamSpot = math::XYZPoint(0.0,0.0,0.0);

  // Initialize the distance from (0,0,0) after which *generated* particles are 
  // no longer considered - because the mother could have interacted before.
  // unit : cm x cm
  lateVertexPosition = 2.5*2.5;

  // Initialize the vectors of particles and vertices
  theGenParticles = new std::vector<HepMC::GenParticle*>(); 
  theSimTracks = new std::vector<FSimTrack>;
  theSimVertices = new std::vector<FSimVertex>;
  theChargedTracks = new std::vector<unsigned>();
  theFSimVerticesType = new FSimVertexTypeCollection();

  // Reserve some size to avoid mutiple copies
  /* */
  theSimTracks->resize(initialSize);
  theSimVertices->resize(initialSize);
  theGenParticles->resize(initialSize);
  theChargedTracks->resize(initialSize);
  theFSimVerticesType->resize(initialSize);
  theTrackSize = initialSize;
  theVertexSize = initialSize;
  theGenSize = initialSize;
  theChargedSize = initialSize;
  /* */

  // Initialize the Particle filter
  myFilter = new KineParticleFilter(kine);

  // Get the Famos Histos pointer
  //  myHistos = Histos::instance();

  // Initialize a few histograms
  /*
  myHistos->book("hvtx",100,-0.1,0.1);
  myHistos->book("hvty",100,-0.1,0.1);
  myHistos->book("hvtz",100,-500.,500.);
  */
}
FBaseSimEvent::~FBaseSimEvent ( )

usual virtual destructor

Definition at line 138 of file FBaseSimEvent.cc.

References myFilter, theChargedTracks, theFSimVerticesType, theGenParticles, theSimTracks, and theSimVertices.

                             {

  // Clear the vectors
  theGenParticles->clear();
  theSimTracks->clear();
  theSimVertices->clear();
  theChargedTracks->clear();
  theFSimVerticesType->clear();

  // Delete 
  delete theGenParticles;
  delete theSimTracks;
  delete theSimVertices;
  delete theChargedTracks;
  delete theFSimVerticesType;
  delete myFilter;

  //Write the histograms
  //  myHistos->put("histos.root");
  //  delete myHistos;
}

Member Function Documentation

void FBaseSimEvent::addChargedTrack ( int  id)

Add an id in the vector of charged tracks id's.

Definition at line 974 of file FBaseSimEvent.cc.

References ExpressReco_HICollisions_FallBack::id, nChargedParticleTracks, theChargedSize, and theChargedTracks.

void FBaseSimEvent::addParticles ( const HepMC::GenEvent &  hev)

Add the particles and their vertices to the list.

Some internal array to work with.

Definition at line 428 of file FBaseSimEvent.cc.

References abs, addSimTrack(), addSimVertex(), PrimaryVertexGenerator::beamSpot(), FSimVertexType::DECAY_VERTEX, ExpressReco_HICollisions_FallBack::e, PrimaryVertexGenerator::generate(), configurableAnalysis::GenParticle, lateVertexPosition, nGenParticles, nGenParts(), evf::evtn::offset(), L1TEmulatorMonitor_cff::p, position, FSimVertexType::PRIMARY_VERTEX, theBeamSpot, theGenParticles, theGenSize, theVertexGenerator, and vertex().

Referenced by fill().

                                                           {

  int genEventSize = myGenEvent.particles_size();
  std::vector<int> myGenVertices(genEventSize, static_cast<int>(0));

  // If no particles, no work to be done !
  if ( myGenEvent.particles_empty() ) return;

  // Are there particles in the FSimEvent already ? 
  int offset = nGenParts();

  // Primary vertex (already smeared by the SmearedVtx module)
  HepMC::GenVertex* primaryVertex = *(myGenEvent.vertices_begin());

  // Beginning of workaround a bug in pythia particle gun
  unsigned primaryMother = primaryVertex->particles_in_size();
  if ( primaryMother ) {
    unsigned partId = (*(primaryVertex->particles_in_const_begin()))->pdg_id();
    if ( abs(partId) == 2212 ) primaryMother = 0;
  }
  // End of workaround a bug in pythia particle gun

  XYZTLorentzVector primaryVertexPosition(primaryVertex->position().x()/10.,
                                          primaryVertex->position().y()/10.,
                                          primaryVertex->position().z()/10.,
                                          primaryVertex->position().t()/10.);
  // Actually this is the true end of the workaround
  primaryVertexPosition *= (1-primaryMother);
  // THE END.

  // Smear the main vertex if needed
  // Now takes the origin from the database
  XYZTLorentzVector smearedVertex; 
  if ( primaryVertexPosition.Vect().Mag2() < 1E-16 ) {
    theVertexGenerator->generate();
    smearedVertex = XYZTLorentzVector(
      theVertexGenerator->X()-theVertexGenerator->beamSpot().X()+theBeamSpot.X(),
      theVertexGenerator->Y()-theVertexGenerator->beamSpot().Y()+theBeamSpot.Y(),
      theVertexGenerator->Z()-theVertexGenerator->beamSpot().Z()+theBeamSpot.Z(),
      0.);
  }

  // Set the main vertex
  myFilter->setMainVertex(primaryVertexPosition+smearedVertex);

  // This is the smeared main vertex
  int mainVertex = addSimVertex(myFilter->vertex(), -1, FSimVertexType::PRIMARY_VERTEX);

  HepMC::GenEvent::particle_const_iterator piter;
  HepMC::GenEvent::particle_const_iterator pbegin = myGenEvent.particles_begin();
  HepMC::GenEvent::particle_const_iterator pend = myGenEvent.particles_end();

  int initialBarcode = 0; 
  if ( pbegin != pend ) initialBarcode = (*pbegin)->barcode();
  // Loop on the particles of the generated event
  for ( piter = pbegin; piter != pend; ++piter ) {

    // This is the generated particle pointer - for the signal event only
    HepMC::GenParticle* p = *piter;

    if  ( !offset ) {
      (*theGenParticles)[nGenParticles++] = p;
      if ( nGenParticles/theGenSize*theGenSize == nGenParticles ) { 
        theGenSize *= 2;
        theGenParticles->resize(theGenSize);
      }

    }

    // Reject particles with late origin vertex (i.e., coming from late decays)
    // This should not happen, but one never knows what users may be up to!
    // For example exotic particles might decay late - keep the decay products in the case.
    XYZTLorentzVector productionVertexPosition(0.,0.,0.,0.);
    HepMC::GenVertex* productionVertex = p->production_vertex();
    if ( productionVertex ) { 
      unsigned productionMother = productionVertex->particles_in_size();
      if ( productionMother ) {
        unsigned motherId = (*(productionVertex->particles_in_const_begin()))->pdg_id();
        if ( abs(motherId) < 1000000 ) 
          productionVertexPosition = 
            XYZTLorentzVector(productionVertex->position().x()/10.,
                              productionVertex->position().y()/10.,
                              productionVertex->position().z()/10.,
                              productionVertex->position().t()/10.) + smearedVertex;
      }
    }
    if ( !myFilter->accept(productionVertexPosition) ) continue;

    int abspdgId = abs(p->pdg_id());
    HepMC::GenVertex* endVertex = p->end_vertex();

    // Keep only: 
    // 1) Stable particles (watch out! New status code = 1001!)
    bool testStable = p->status()%1000==1;
    // Declare stable standard particles that decay after a macroscopic path length
    // (except if exotic)
    if ( p->status() == 2 && abspdgId < 1000000) {
      if ( endVertex ) { 
        XYZTLorentzVector decayPosition = 
          XYZTLorentzVector(endVertex->position().x()/10.,
                            endVertex->position().y()/10.,
                            endVertex->position().z()/10.,
                            endVertex->position().t()/10.) + smearedVertex;
        // If the particle flew enough to be beyond the beam pipe enveloppe, just declare it stable
        if ( decayPosition.Perp2() > lateVertexPosition ) testStable = true;
      }
    }      

    // 2) or particles with stable daughters (watch out! New status code = 1001!)
    bool testDaugh = false;
    if ( !testStable && 
         p->status() == 2 &&
         endVertex && 
         endVertex->particles_out_size() ) { 
      HepMC::GenVertex::particles_out_const_iterator firstDaughterIt = 
        endVertex->particles_out_const_begin();
      HepMC::GenVertex::particles_out_const_iterator lastDaughterIt = 
        endVertex->particles_out_const_end();
      for ( ; firstDaughterIt != lastDaughterIt ; ++firstDaughterIt ) {
        HepMC::GenParticle* daugh = *firstDaughterIt;
        if ( daugh->status()%1000==1 ) {
          // Check that it is not a "prompt electron or muon brem":
          if (abspdgId == 11 || abspdgId == 13) {
            if ( endVertex ) { 
              XYZTLorentzVector endVertexPosition = XYZTLorentzVector(endVertex->position().x()/10.,
                                                                      endVertex->position().y()/10.,
                                                                      endVertex->position().z()/10.,
                                                                      endVertex->position().t()/10.);
              // If the particle flew enough to be beyond the beam pipe enveloppe, just declare it stable
              if ( endVertexPosition.Perp2() < lateVertexPosition ) {
                break;
              }
            }
          }
          testDaugh=true;
          break;
        }
      }
    }

    // 3) or particles that fly more than one micron.
    double dist = 0.;
    if ( !testStable && !testDaugh && p->production_vertex() ) {
      XYZTLorentzVector 
        productionVertexPosition(p->production_vertex()->position().x()/10.,
                                 p->production_vertex()->position().y()/10.,
                                 p->production_vertex()->position().z()/10.,
                                 p->production_vertex()->position().t()/10.);
      dist = (primaryVertexPosition-productionVertexPosition).Vect().Mag2();
    }
    bool testDecay = ( dist > 1e-8 ) ? true : false; 

    // Save the corresponding particle and vertices
    if ( testStable || testDaugh || testDecay ) {
      
      /*
      const HepMC::GenParticle* mother = p->production_vertex() ?
        *(p->production_vertex()->particles_in_const_begin()) : 0;
      */

      int motherBarcode = p->production_vertex() && 
        p->production_vertex()->particles_in_const_begin() !=
        p->production_vertex()->particles_in_const_end() ?
        (*(p->production_vertex()->particles_in_const_begin()))->barcode() : 0;

      int originVertex = 
        motherBarcode && myGenVertices[motherBarcode-initialBarcode] ?
        myGenVertices[motherBarcode-initialBarcode] : mainVertex;

      XYZTLorentzVector momentum(p->momentum().px(),
                                 p->momentum().py(),
                                 p->momentum().pz(),
                                 p->momentum().e());
      RawParticle part(momentum, vertex(originVertex).position());
      part.setID(p->pdg_id());

      // Add the particle to the event and to the various lists
      
      int theTrack = testStable && p->end_vertex() ? 
        // The particle is scheduled to decay
        addSimTrack(&part,originVertex, nGenParts()-offset,p->end_vertex()) :
        // The particle is not scheduled to decay 
        addSimTrack(&part,originVertex, nGenParts()-offset);

      if ( 
          // This one deals with particles with no end vertex
          !p->end_vertex() ||
          // This one deals with particles that have a pre-defined
          // decay proper time, but have not decayed yet
          ( testStable && p->end_vertex() &&  !p->end_vertex()->particles_out_size() ) 
          // In both case, just don't add a end vertex in the FSimEvent 
          ) continue; 
      
      // Add the vertex to the event and to the various lists
      XYZTLorentzVector decayVertex = 
        XYZTLorentzVector(p->end_vertex()->position().x()/10.,
                          p->end_vertex()->position().y()/10.,
                          p->end_vertex()->position().z()/10.,
                          p->end_vertex()->position().t()/10.) +
        smearedVertex;
      //        vertex(mainVertex).position();
      int theVertex = addSimVertex(decayVertex,theTrack, FSimVertexType::DECAY_VERTEX);

      if ( theVertex != -1 ) myGenVertices[p->barcode()-initialBarcode] = theVertex;

      // There we are !
    }
  }

}
void FBaseSimEvent::addParticles ( const reco::GenParticleCollection myGenParticles)

Some internal array to work with.

Definition at line 641 of file FBaseSimEvent.cc.

References abs, addSimTrack(), addSimVertex(), PrimaryVertexGenerator::beamSpot(), reco::CompositeRefCandidateT< D >::daughter(), FSimVertexType::DECAY_VERTEX, ExpressReco_HICollisions_FallBack::e, reco::Candidate::end(), reco::LeafCandidate::energy(), PrimaryVertexGenerator::generate(), lateVertexPosition, reco::CompositeRefCandidateT< D >::mother(), nGenParticles, nGenParts(), nParticles, nTracks(), reco::CompositeRefCandidateT< D >::numberOfDaughters(), reco::CompositeRefCandidateT< D >::numberOfMothers(), evf::evtn::offset(), L1TEmulatorMonitor_cff::p, reco::LeafCandidate::pdgId(), reco::Candidate::pdgId(), benchmark_cfg::pdgId, position, FSimVertexType::PRIMARY_VERTEX, reco::LeafCandidate::px(), reco::LeafCandidate::py(), reco::LeafCandidate::pz(), reco::Candidate::status(), reco::LeafCandidate::status(), theBeamSpot, theVertexGenerator, vertex(), reco::Candidate::vx(), reco::LeafCandidate::vx(), reco::LeafCandidate::vy(), reco::Candidate::vy(), reco::LeafCandidate::vz(), and reco::Candidate::vz().

                                                                           {

  // If no particles, no work to be done !
  unsigned int nParticles = myGenParticles.size();
  nGenParticles = nParticles;

  if ( !nParticles ) return;

  std::map<const reco::Candidate*,int> myGenVertices;

  // Are there particles in the FSimEvent already ? 
  int offset = nTracks();

  // Skip the incoming protons
  nGenParticles = 0;
  unsigned int ip = 0;
  if ( nParticles > 1 && 
       myGenParticles[0].pdgId() == 2212 &&
       myGenParticles[1].pdgId() == 2212 ) { 
    ip = 2;
    nGenParticles = 2;
  }

  // Primary vertex (already smeared by the SmearedVtx module)
  XYZTLorentzVector primaryVertex (myGenParticles[ip].vx(),
                                   myGenParticles[ip].vy(),
                                   myGenParticles[ip].vz(),
                                   0.);

  // Smear the main vertex if needed
  XYZTLorentzVector smearedVertex;
  if ( primaryVertex.mag() < 1E-8 ) {
    theVertexGenerator->generate();
    smearedVertex = XYZTLorentzVector(
      theVertexGenerator->X()-theVertexGenerator->beamSpot().X()+theBeamSpot.X(),
      theVertexGenerator->Y()-theVertexGenerator->beamSpot().Y()+theBeamSpot.Y(),
      theVertexGenerator->Z()-theVertexGenerator->beamSpot().Z()+theBeamSpot.Z(),
      0.);
  }

  // Set the main vertex
  myFilter->setMainVertex(primaryVertex+smearedVertex);

  // This is the smeared main vertex
  int mainVertex = addSimVertex(myFilter->vertex(), -1, FSimVertexType::PRIMARY_VERTEX);

  // Loop on the particles of the generated event
  for ( ; ip<nParticles; ++ip ) { 
    
    // nGenParticles = ip;
    
    nGenParticles++;
    const reco::GenParticle& p = myGenParticles[ip];

    // Reject particles with late origin vertex (i.e., coming from late decays)
    // This should not happen, but one never knows what users may be up to!
    // For example exotic particles might decay late - keep the decay products in the case.
    XYZTLorentzVector productionVertexPosition(0.,0.,0.,0.);
    const reco::Candidate* productionMother = p.numberOfMothers() ? p.mother(0) : 0;
    if ( productionMother ) {
      unsigned motherId = productionMother->pdgId();
      if ( abs(motherId) < 1000000 )
        productionVertexPosition = XYZTLorentzVector(p.vx(), p.vy(), p.vz(), 0.) + smearedVertex;
    }
    if ( !myFilter->accept(productionVertexPosition) ) continue;

    // Keep only: 
    // 1) Stable particles
    bool testStable = p.status()%1000==1;
    // Declare stable standard particles that decay after a macroscopic path length 
    // (except if exotic particle)
    if ( p.status() == 2 && abs(p.pdgId()) < 1000000 ) {
      unsigned int nDaughters = p.numberOfDaughters();
      if ( nDaughters ) { 
        const reco::Candidate* daughter = p.daughter(0);
        XYZTLorentzVector decayPosition = 
          XYZTLorentzVector(daughter->vx(), daughter->vy(), daughter->vz(), 0.) + smearedVertex;
        // If the particle flew enough to be beyond the beam pipe enveloppe, just declare it stable
        if ( decayPosition.Perp2() > lateVertexPosition ) testStable = true;
      }
    }

    // 2) or particles with stable daughters
    bool testDaugh = false;
    unsigned int nDaughters = p.numberOfDaughters();
    if ( !testStable  && 
         //      p.status() == 2 && 
         nDaughters ) {  
      for ( unsigned iDaughter=0; iDaughter<nDaughters; ++iDaughter ) {
        const reco::Candidate* daughter = p.daughter(iDaughter);
        if ( daughter->status()%1000==1 ) {
          testDaugh=true;
          break;
        }
      }
    }

    // 3) or particles that fly more than one micron.
    double dist = 0.;
    if ( !testStable && !testDaugh ) {
      XYZTLorentzVector productionVertex(p.vx(),p.vy(),p.vz(),0.);
      dist = (primaryVertex-productionVertex).Vect().Mag2();
    }
    bool testDecay = ( dist > 1e-8 ) ? true : false; 

    // Save the corresponding particle and vertices
    if ( testStable || testDaugh || testDecay ) {
      
      const reco::Candidate* mother = p.numberOfMothers() ? p.mother(0) : 0;

      int originVertex = 
        mother &&  
        myGenVertices.find(mother) != myGenVertices.end() ? 
        myGenVertices[mother] : mainVertex;
      
      XYZTLorentzVector momentum(p.px(),p.py(),p.pz(),p.energy());
      RawParticle part(momentum, vertex(originVertex).position());
      part.setID(p.pdgId());

      // Add the particle to the event and to the various lists
      int theTrack = addSimTrack(&part,originVertex, nGenParts()-offset);

      // It there an end vertex ?
      if ( !nDaughters ) continue; 
      const reco::Candidate* daughter = p.daughter(0);

      // Add the vertex to the event and to the various lists
      XYZTLorentzVector decayVertex = 
        XYZTLorentzVector(daughter->vx(), daughter->vy(),
                          daughter->vz(), 0.) + smearedVertex;
      int theVertex = addSimVertex(decayVertex,theTrack, FSimVertexType::DECAY_VERTEX);

      if ( theVertex != -1 ) myGenVertices[&p] = theVertex;

      // There we are !
    }
  }

  // There is no GenParticle's in that case...
  // nGenParticles=0;

}
int FBaseSimEvent::addSimTrack ( const RawParticle p,
int  iv,
int  ig = -1,
const HepMC::GenVertex *  ev = 0 
)

Add a new track to the Event and to the various lists.

Definition at line 786 of file FBaseSimEvent.cc.

References FSimTrack::addDaughter(), FSimVertex::addDaughter(), SimTrack::genpartIndex(), RawParticle::momentum(), nSimTracks, dbtoconf::parent, RawParticle::PDGmass(), mathSSE::sqrt(), RawParticle::t(), theSimTracks, theTrackSize, track(), and vertex().

Referenced by addParticles(), fill(), MaterialEffects::interact(), PileUpSimulator::produce(), and TrajectoryManager::updateWithDaughters().

                                                     { 
  
  // Check that the particle is in the Famos "acceptance"
  // Keep all primaries of pile-up events, though
  if ( !myFilter->accept(p) && ig >= -1 ) return -1;

  // The new track index
  int trackId = nSimTracks++;
  if ( nSimTracks/theTrackSize*theTrackSize == nSimTracks ) {
    theTrackSize *= 2;
    theSimTracks->resize(theTrackSize);
  }

  // Attach the particle to the origin vertex, and to the mother
  vertex(iv).addDaughter(trackId);
  if ( !vertex(iv).noParent() ) {
    track(vertex(iv).parent().id()).addDaughter(trackId);

    if ( ig == -1 ) {
      int motherId = track(vertex(iv).parent().id()).genpartIndex();
      if ( motherId < -1 ) ig = motherId;
    }
  }
    
  // Some transient information for FAMOS internal use
  (*theSimTracks)[trackId] = ev ? 
    // A proper decay time is scheduled
    FSimTrack(p,iv,ig,trackId,this,
              ev->position().t()/10.
              * p->PDGmass()
              / std::sqrt(p->momentum().Vect().Mag2())) : 
    // No proper decay time is scheduled
    FSimTrack(p,iv,ig,trackId,this);

  return trackId;

}
int FBaseSimEvent::addSimVertex ( const XYZTLorentzVector decayVertex,
int  im = -1,
FSimVertexType::VertexType  type = FSimVertexType::ANY 
)

Add a new vertex to the Event and to the various lists.

Definition at line 826 of file FBaseSimEvent.cc.

References nSimVertices, FSimTrack::setEndVertex(), theFSimVerticesType, theSimVertices, theVertexSize, and track().

Referenced by addParticles(), fill(), MaterialEffects::interact(), PileUpSimulator::produce(), TrajectoryManager::reconstruct(), and TrajectoryManager::updateWithDaughters().

                                                                                             {
  
  // Check that the vertex is in the Famos "acceptance"
  if ( !myFilter->accept(v) ) return -1;

  // The number of vertices
  int vertexId = nSimVertices++;
  if ( nSimVertices/theVertexSize*theVertexSize == nSimVertices ) {
    theVertexSize *= 2;
    theSimVertices->resize(theVertexSize);
    theFSimVerticesType->resize(theVertexSize);
  }

  // Attach the end vertex to the particle (if accepted)
  if ( im !=-1 ) track(im).setEndVertex(vertexId);

  // Some transient information for FAMOS internal use
  (*theSimVertices)[vertexId] = FSimVertex(v,im,vertexId,this);

  (*theFSimVerticesType)[vertexId] = FSimVertexType(type);

  return vertexId;

}
int FBaseSimEvent::chargedTrack ( int  id) const

return "reconstructed" charged tracks index.

Definition at line 984 of file FBaseSimEvent.cc.

References ExpressReco_HICollisions_FallBack::id, nChargedParticleTracks, and theChargedTracks.

                                        {
  if (id>=0 && id<(int)nChargedParticleTracks) 
    return (*theChargedTracks)[id]; 
  else 
    return -1;
}
void FBaseSimEvent::clear ( void  )

clear the FBaseSimEvent content before the next event

Definition at line 964 of file FBaseSimEvent.cc.

References nChargedParticleTracks, nGenParticles, nSimTracks, and nSimVertices.

Referenced by fill().

const HepMC::GenParticle * FBaseSimEvent::embdGenpart ( int  i) const

return MC track with a given id

Definition at line 1004 of file FBaseSimEvent.cc.

References i, and theGenParticles.

                                      {
  return (*theGenParticles)[i]; 
}
const SimTrack& FBaseSimEvent::embdTrack ( int  i) const [inline]

return embedded track with given id

Referenced by FSimEvent::load().

const SimVertex& FBaseSimEvent::embdVertex ( int  i) const [inline]

return embedded vertex with given id

Referenced by FSimEvent::load().

const FSimVertexType& FBaseSimEvent::embdVertexType ( int  i) const [inline]

return embedded vertex type with given id

Referenced by FSimEvent::load().

void FBaseSimEvent::fill ( const reco::GenParticleCollection hev)

fill the FBaseSimEvent from the current reco::GenParticleCollection

Definition at line 194 of file FBaseSimEvent.cc.

References addParticles(), and clear().

                                                                   {
  
  // Clear old vectors
  clear();

  // Add the particles in the FSimEvent
  addParticles(myGenParticles);

}
void FBaseSimEvent::fill ( const std::vector< SimTrack > &  simTracks,
const std::vector< SimVertex > &  simVertices 
)

fill the FBaseSimEvent from SimTrack's and SimVert'ices

Reimplemented in FSimEvent.

Definition at line 205 of file FBaseSimEvent.cc.

References abs, addSimTrack(), addSimVertex(), FSimTrack::charge(), clear(), SimTrack::genpartIndex(), BaseParticlePropagator::getSuccess(), lateVertexPosition, CoreSimTrack::momentum(), FSimTrack::momentum(), SimVertex::noParent(), FSimTrack::notYetToEndVertex(), nTracks(), SimVertex::parentIndex(), pos, position, FSimVertex::position(), CoreSimVertex::position(), FSimVertexType::PRIMARY_VERTEX, BaseParticlePropagator::propagateToEcalEntrance(), BaseParticlePropagator::propagateToHcalEntrance(), BaseParticlePropagator::propagateToPreshowerLayer1(), BaseParticlePropagator::propagateToPreshowerLayer2(), BaseParticlePropagator::propagateToVFcalEntrance(), RawParticle::setCharge(), FSimTrack::setEcal(), FSimTrack::setHcal(), FSimTrack::setLayer1(), FSimTrack::setLayer2(), FSimTrack::setVFcal(), matplotRender::t, track(), SimTrack::trackerSurfaceMomentum(), SimTrack::trackerSurfacePosition(), CoreSimTrack::type(), RawParticle::vertex(), vertex(), FSimTrack::vertex(), SimTrack::vertIndex(), ExpressReco_HICollisions_FallBack::x, ExpressReco_HICollisions_FallBack::y, and z.

                                                             {

  // Watch out there ! A SimVertex is in mm (stupid), 
  //            while a FSimVertex is in cm (clever).
  
  clear();

  unsigned nVtx = simVertices.size();
  unsigned nTks = simTracks.size();

  // Empty event, do nothin'
  if ( nVtx == 0 ) return;

  // Two arrays for internal use.
  std::vector<int> myVertices(nVtx,-1);
  std::vector<int> myTracks(nTks,-1);

  // create a map associating geant particle id and position in the 
  // event SimTrack vector
  
  std::map<unsigned, unsigned> geantToIndex;
  for( unsigned it=0; it<simTracks.size(); ++it ) {
    geantToIndex[ simTracks[it].trackId() ] = it;
  }  

  // Create also a map associating a SimTrack with its endVertex
  /*
  std::map<unsigned, unsigned> endVertex;
  for ( unsigned iv=0; iv<simVertices.size(); ++iv ) { 
    endVertex[ simVertices[iv].parentIndex() ] = iv;
  }
  */

  // Set the main vertex for the kine particle filter
  // SimVertices were in mm until 110_pre2
  //  HepLorentzVector primaryVertex = simVertices[0].position()/10.;
  // SImVertices are now in cm
  // Also : position is copied until SimVertex switches to Mathcore.
  //  XYZTLorentzVector primaryVertex = simVertices[0].position();
  // The next 5 lines to be then replaced by the previous line
  XYZTLorentzVector primaryVertex(simVertices[0].position().x(),
                                  simVertices[0].position().y(),
                                  simVertices[0].position().z(),
                                  simVertices[0].position().t());
  //
  myFilter->setMainVertex(primaryVertex);
  // Add the main vertex to the list.
  addSimVertex(myFilter->vertex(), -1, FSimVertexType::PRIMARY_VERTEX);
  myVertices[0] = 0;

  for( unsigned trackId=0; trackId<nTks; ++trackId ) {

    // The track
    const SimTrack& track = simTracks[trackId];
    //    std::cout << std::endl << "SimTrack " << trackId << " " << track << std::endl;

    // The origin vertex
    int vertexId = track.vertIndex();
    const SimVertex& vertex = simVertices[vertexId];
    //std::cout << "Origin vertex " << vertexId << " " << vertex << std::endl;

    // The mother track 
    int motherId = -1;
    if( !vertex.noParent() ) { // there is a parent to this vertex
      // geant id of the mother
      unsigned motherGeantId =   vertex.parentIndex(); 
      std::map<unsigned, unsigned >::iterator association  
        = geantToIndex.find( motherGeantId );
      if(association != geantToIndex.end() )
        motherId = association->second;
    }
    int originId = motherId == - 1 ? -1 : myTracks[motherId];
    //std::cout << "Origin id " << originId << std::endl;

    /*
    if ( endVertex.find(trackId) != endVertex.end() ) 
      std::cout << "End vertex id = " << endVertex[trackId] << std::endl;
    else
      std::cout << "No endVertex !!! " << std::endl;
    std::cout << "Tracker surface position " << track.trackerSurfacePosition() << std::endl;
    */

    // Add the vertex (if it does not already exist!)
    XYZTLorentzVector position(vertex.position().px(),vertex.position().py(),
                               vertex.position().pz(),vertex.position().e());
    if ( myVertices[vertexId] == -1 ) 
      // Momentum and position are copied until SimTrack and SimVertex
      // switch to Mathcore.
      //      myVertices[vertexId] = addSimVertex(vertex.position(),originId); 
      // The next line to be then replaced by the previous line
      myVertices[vertexId] = addSimVertex(position,originId); 

    // Add the track (with protection for brem'ing electrons and muons)
    int motherType = motherId == -1 ? 0 : simTracks[motherId].type();

    bool notBremInDetector =
      (abs(motherType) != 11 && abs(motherType) != 13) ||
      motherType != track.type() ||
      position.Perp2() < lateVertexPosition ;

    if ( notBremInDetector ) {
      // Momentum and position are copied until SimTrack and SimVertex
      // switch to Mathcore.
      //      RawParticle part(track.momentum(), vertex.position());
      // The next 3 lines to be then replaced by the previous line
      XYZTLorentzVector momentum(track.momentum().px(),track.momentum().py(),
                                 track.momentum().pz(),track.momentum().e());
      RawParticle part(momentum,position);
      //
      part.setID(track.type()); 
      //std::cout << "Ctau  = " << part.PDGcTau() << std::endl;
      // Don't save tracks that have decayed immediately but for which no daughters
      // were saved (probably due to cuts on E, pT and eta)
      //  if ( part.PDGcTau() > 0.1 || endVertex.find(trackId) != endVertex.end() ) 
      myTracks[trackId] = addSimTrack(&part,myVertices[vertexId],track.genpartIndex());
      if ( myTracks[trackId] >= 0 ) { 
        (*theSimTracks)[ myTracks[trackId] ].setTkPosition(track.trackerSurfacePosition());
        (*theSimTracks)[ myTracks[trackId] ].setTkMomentum(track.trackerSurfaceMomentum());
      }
    } else {

      myTracks[trackId] = myTracks[motherId];
      if ( myTracks[trackId] >= 0 ) { 
        (*theSimTracks)[ myTracks[trackId] ].setTkPosition(track.trackerSurfacePosition());
        (*theSimTracks)[ myTracks[trackId] ].setTkMomentum(track.trackerSurfaceMomentum());
      }
    }
    
  }

  // Now loop over the remaining end vertices !
  for( unsigned vertexId=0; vertexId<nVtx; ++vertexId ) {

    // if the vertex is already saved, just ignore.
    if ( myVertices[vertexId] != -1 ) continue;

    // The yet unused vertex
    const SimVertex& vertex = simVertices[vertexId];

    // The mother track 
    int motherId = -1;
    if( !vertex.noParent() ) { // there is a parent to this vertex

      // geant id of the mother
      unsigned motherGeantId =   vertex.parentIndex(); 
      std::map<unsigned, unsigned >::iterator association  
        = geantToIndex.find( motherGeantId );
      if(association != geantToIndex.end() )
        motherId = association->second;
    }
    int originId = motherId == - 1 ? -1 : myTracks[motherId];

    // Add the vertex
    // Momentum and position are copied until SimTrack and SimVertex
    // switch to Mathcore.
    //    myVertices[vertexId] = addSimVertex(vertex.position(),originId);
    // The next 3 lines to be then replaced by the previous line
    XYZTLorentzVector position(vertex.position().px(),vertex.position().py(),
                               vertex.position().pz(),vertex.position().e());
    myVertices[vertexId] = addSimVertex(position,originId); 
  }

  // Finally, propagate all particles to the calorimeters
  BaseParticlePropagator myPart;
  XYZTLorentzVector mom;
  XYZTLorentzVector pos;

  // Loop over the tracks
  for( int fsimi=0; fsimi < (int)nTracks() ; ++fsimi) {

    
    FSimTrack& myTrack = track(fsimi);
    double trackerSurfaceTime = myTrack.vertex().position().t() 
                              + myTrack.momentum().e()/myTrack.momentum().pz()
                              * ( myTrack.trackerSurfacePosition().z()
                                - myTrack.vertex().position().z() );
    pos = XYZTLorentzVector(myTrack.trackerSurfacePosition().x(),
                            myTrack.trackerSurfacePosition().y(),
                            myTrack.trackerSurfacePosition().z(),
                                    trackerSurfaceTime);
    mom = XYZTLorentzVector(myTrack.trackerSurfaceMomentum().x(),
                            myTrack.trackerSurfaceMomentum().y(),
                            myTrack.trackerSurfaceMomentum().z(),
                            myTrack.trackerSurfaceMomentum().t());

    if ( mom.T() >  0. ) {  
      // The particle to be propagated
      myPart = BaseParticlePropagator(RawParticle(mom,pos),0.,0.,4.);
      myPart.setCharge(myTrack.charge());
      
      // Propagate to Preshower layer 1
      myPart.propagateToPreshowerLayer1(false);
      if ( myTrack.notYetToEndVertex(myPart.vertex()) && myPart.getSuccess()>0 )
        myTrack.setLayer1(myPart,myPart.getSuccess());
      
      // Propagate to Preshower Layer 2 
      myPart.propagateToPreshowerLayer2(false);
      if ( myTrack.notYetToEndVertex(myPart.vertex()) && myPart.getSuccess()>0 )
        myTrack.setLayer2(myPart,myPart.getSuccess());
      
      // Propagate to Ecal Endcap
      myPart.propagateToEcalEntrance(false);
      if ( myTrack.notYetToEndVertex(myPart.vertex()) )
        myTrack.setEcal(myPart,myPart.getSuccess());
      
      // Propagate to HCAL entrance
      myPart.propagateToHcalEntrance(false);
      if ( myTrack.notYetToEndVertex(myPart.vertex()) )
        myTrack.setHcal(myPart,myPart.getSuccess());
      
      // Propagate to VFCAL entrance
      myPart.propagateToVFcalEntrance(false);
      if ( myTrack.notYetToEndVertex(myPart.vertex()) )
        myTrack.setVFcal(myPart,myPart.getSuccess());
    }
 
  }

}
void FBaseSimEvent::fill ( const HepMC::GenEvent &  hev)

fill the FBaseSimEvent from the current HepMC::GenEvent

Definition at line 175 of file FBaseSimEvent.cc.

References addParticles(), and clear().

                                                   {
  
  // Clear old vectors
  clear();

  // Add the particles in the FSimEvent
  addParticles(myGenEvent);

  /*
  std::cout << "The MC truth! " << std::endl;
  printMCTruth(myGenEvent);

  std::cout << std::endl  << "The FAMOS event! " << std::endl;
  print();
  */

}
const KineParticleFilter& FBaseSimEvent::filter ( ) const [inline]

Definition at line 146 of file FBaseSimEvent.h.

References myFilter.

Referenced by TrajectoryManager::reconstruct().

{ return *myFilter; } 
std::vector<HepMC::GenParticle*>* FBaseSimEvent::genparts ( ) const [inline, protected]

The pointer to the vector of GenParticle's.

Definition at line 168 of file FBaseSimEvent.h.

References theGenParticles.

                                                        { 
    return theGenParticles; 
  }
void FBaseSimEvent::initializePdt ( const HepPDT::ParticleDataTable aPdt)

Initialize the particle data table.

Definition at line 161 of file FBaseSimEvent.cc.

References pdt.

Referenced by FamosManager::setupGeometryAndField().

                                                                { 

  pdt = aPdt; 

}
unsigned int FBaseSimEvent::nChargedTracks ( ) const [inline]

Number of "reconstructed" charged tracks.

Definition at line 110 of file FBaseSimEvent.h.

References nChargedParticleTracks.

unsigned int FBaseSimEvent::nGenParts ( ) const [inline]

Number of generator particles.

Reimplemented in FSimEvent.

Definition at line 105 of file FBaseSimEvent.h.

References nGenParticles.

Referenced by addParticles().

                                        {
    return nGenParticles;
  }
unsigned int FBaseSimEvent::nTracks ( ) const [inline]

Number of tracks.

Reimplemented in FSimEvent.

Definition at line 95 of file FBaseSimEvent.h.

References nSimTracks.

Referenced by addParticles(), fill(), and print().

                                      {
    return nSimTracks;
  }
unsigned int FBaseSimEvent::nVertices ( ) const [inline]

Number of vertices.

Reimplemented in FSimEvent.

Definition at line 100 of file FBaseSimEvent.h.

References nSimVertices.

Referenced by print().

                                        { 
    return nSimVertices;
  }
void FBaseSimEvent::print ( void  ) const

print the FBaseSimEvent in an intelligible way

Definition at line 947 of file FBaseSimEvent.cc.

References gather_cfg::cout, i, nTracks(), nVertices(), track(), and vertexType().

Referenced by CalorimetryManager::reconstruct().

                           {

  std::cout << "  Id  Gen Name       eta    phi     pT     E    Vtx1   " 
            << " x      y      z   " 
            << "Moth  Vtx2  eta   phi     R      Z   Daughters Ecal?" << std::endl;

  for( int i=0; i<(int)nTracks(); i++ ) 
    std::cout << track(i) << std::endl;

  for( int i=0; i<(int)nVertices(); i++ ) 
    std::cout << "i = " << i << "  " << vertexType(i) << std::endl;

  

}
void FBaseSimEvent::printMCTruth ( const HepMC::GenEvent &  hev)

print the original MCTruth event

Definition at line 852 of file FBaseSimEvent.cc.

References gather_cfg::cout, eta(), configurableAnalysis::GenParticle, ExpressReco_HICollisions_FallBack::id, gen::k, AlCaRecoCosmics_cfg::name, L1TEmulatorMonitor_cff::p, RecoTau_DiTaus_pt_20-420_cfg::ParticleID, and pdt.

                                                           {
  
  std::cout << "Id  Gen Name       eta    phi     pT     E    Vtx1   " 
            << " x      y      z   " 
            << "Moth  Vtx2  eta   phi     R      Z   Da1  Da2 Ecal?" << std::endl;

  for ( HepMC::GenEvent::particle_const_iterator 
          piter  = myGenEvent.particles_begin();
          piter != myGenEvent.particles_end(); 
        ++piter ) {
    
    HepMC::GenParticle* p = *piter;
     /* */
    int partId = p->pdg_id();
    std::string name;

    if ( pdt->particle(ParticleID(partId)) !=0 ) {
      name = (pdt->particle(ParticleID(partId)))->name();
    } else {
      name = "none";
    }
  
    XYZTLorentzVector momentum1(p->momentum().px(),
                                p->momentum().py(),
                                p->momentum().pz(),
                                p->momentum().e());

    int vertexId1 = 0;

    if ( !p->production_vertex() ) continue;

    XYZVector vertex1 (p->production_vertex()->position().x()/10.,
                       p->production_vertex()->position().y()/10.,
                       p->production_vertex()->position().z()/10.);
    vertexId1 = p->production_vertex()->barcode();
    
    std::cout.setf(std::ios::fixed, std::ios::floatfield);
    std::cout.setf(std::ios::right, std::ios::adjustfield);
    
    std::cout << std::setw(4) << p->barcode() << " " 
         << name;
    
    for(unsigned int k=0;k<11-name.length() && k<12; k++) std::cout << " ";  
    
    double eta = momentum1.eta();
    if ( eta > +10. ) eta = +10.;
    if ( eta < -10. ) eta = -10.;
    std::cout << std::setw(6) << std::setprecision(2) << eta << " " 
              << std::setw(6) << std::setprecision(2) << momentum1.phi() << " " 
              << std::setw(7) << std::setprecision(2) << momentum1.pt() << " " 
              << std::setw(7) << std::setprecision(2) << momentum1.e() << " " 
              << std::setw(4) << vertexId1 << " " 
              << std::setw(6) << std::setprecision(1) << vertex1.x() << " " 
              << std::setw(6) << std::setprecision(1) << vertex1.y() << " " 
              << std::setw(6) << std::setprecision(1) << vertex1.z() << " ";

    const HepMC::GenParticle* mother = 
      *(p->production_vertex()->particles_in_const_begin());

    if ( mother )
      std::cout << std::setw(4) << mother->barcode() << " ";
    else 
      std::cout << "     " ;
    
    if ( p->end_vertex() ) {  
      XYZTLorentzVector vertex2(p->end_vertex()->position().x()/10.,
                                p->end_vertex()->position().y()/10.,
                                p->end_vertex()->position().z()/10.,
                                p->end_vertex()->position().t()/10.);
      int vertexId2 = p->end_vertex()->barcode();

      std::vector<const HepMC::GenParticle*> children;
      HepMC::GenVertex::particles_out_const_iterator firstDaughterIt = 
        p->end_vertex()->particles_out_const_begin();
      HepMC::GenVertex::particles_out_const_iterator lastDaughterIt = 
        p->end_vertex()->particles_out_const_end();
      for ( ; firstDaughterIt != lastDaughterIt ; ++firstDaughterIt ) {
        children.push_back(*firstDaughterIt);
      }      

      std::cout << std::setw(4) << vertexId2 << " "
                << std::setw(6) << std::setprecision(2) << vertex2.eta() << " " 
                << std::setw(6) << std::setprecision(2) << vertex2.phi() << " " 
                << std::setw(5) << std::setprecision(1) << vertex2.pt() << " " 
                << std::setw(6) << std::setprecision(1) << vertex2.z() << " ";
      for ( unsigned id=0; id<children.size(); ++id )
        std::cout << std::setw(4) << children[id]->barcode() << " ";
    }
    std::cout << std::endl;

  }

}
void FBaseSimEvent::setBeamSpot ( const math::XYZPoint aBeamSpot) [inline]

Set the beam spot position.

Definition at line 151 of file FBaseSimEvent.h.

References theBeamSpot.

Referenced by FamosProducer::produce().

                                                         { 
    theBeamSpot = aBeamSpot;
  }
PrimaryVertexGenerator* FBaseSimEvent::thePrimaryVertexGenerator ( ) const [inline]

Definition at line 148 of file FBaseSimEvent.h.

References theVertexGenerator.

{ return theVertexGenerator; }
const HepPDT::ParticleDataTable* FBaseSimEvent::theTable ( ) const [inline]

Get the pointer to the particle data table.

Definition at line 64 of file FBaseSimEvent.h.

References pdt.

Referenced by FSimTrack::FSimTrack().

                                                         { 
    return pdt;
  }
FSimTrack& FBaseSimEvent::track ( int  id) const [inline]
std::vector<FSimTrack>* FBaseSimEvent::tracks ( void  ) const [inline, protected]

The pointer to the vector of FSimTrack's.

Definition at line 158 of file FBaseSimEvent.h.

References theSimTracks.

                                              { 
    return theSimTracks; 
  }
FSimVertex& FBaseSimEvent::vertex ( int  id) const [inline]

Return vertex with given Id.

Referenced by addParticles(), addSimTrack(), fill(), and TrajectoryManager::updateWithDaughters().

FSimVertexType& FBaseSimEvent::vertexType ( int  id) const [inline]

Return vertex with given Id.

Referenced by print().

std::vector<FSimVertex>* FBaseSimEvent::vertices ( ) const [inline, protected]

The pointer to the vector of FSimVertex's.

Definition at line 163 of file FBaseSimEvent.h.

References theSimVertices.

                                                 { 
    return theSimVertices; 
  }

Member Data Documentation

unsigned int FBaseSimEvent::initialSize [private]

Definition at line 192 of file FBaseSimEvent.h.

Referenced by FBaseSimEvent().

Definition at line 205 of file FBaseSimEvent.h.

Referenced by addParticles(), FBaseSimEvent(), and fill().

The particle filter.

Definition at line 195 of file FBaseSimEvent.h.

Referenced by filter(), and ~FBaseSimEvent().

unsigned int FBaseSimEvent::nChargedParticleTracks [private]

Definition at line 186 of file FBaseSimEvent.h.

Referenced by addChargedTrack(), chargedTrack(), clear(), and nChargedTracks().

unsigned int FBaseSimEvent::nGenParticles [private]

Definition at line 185 of file FBaseSimEvent.h.

Referenced by addParticles(), clear(), and nGenParts().

unsigned int FBaseSimEvent::nSimTracks [private]

Definition at line 183 of file FBaseSimEvent.h.

Referenced by addSimTrack(), clear(), and nTracks().

unsigned int FBaseSimEvent::nSimVertices [private]

Definition at line 184 of file FBaseSimEvent.h.

Referenced by addSimVertex(), clear(), and nVertices().

Definition at line 201 of file FBaseSimEvent.h.

Referenced by initializePdt(), printMCTruth(), and theTable().

Definition at line 207 of file FBaseSimEvent.h.

Referenced by FBaseSimEvent().

double FBaseSimEvent::sigmaVerteX [private]

Definition at line 197 of file FBaseSimEvent.h.

double FBaseSimEvent::sigmaVerteY [private]

Definition at line 198 of file FBaseSimEvent.h.

double FBaseSimEvent::sigmaVerteZ [private]

Definition at line 199 of file FBaseSimEvent.h.

Definition at line 204 of file FBaseSimEvent.h.

Referenced by addParticles(), FBaseSimEvent(), and setBeamSpot().

unsigned int FBaseSimEvent::theChargedSize [private]

Definition at line 191 of file FBaseSimEvent.h.

Referenced by addChargedTrack(), and FBaseSimEvent().

std::vector<unsigned>* FBaseSimEvent::theChargedTracks [private]

Definition at line 181 of file FBaseSimEvent.h.

Referenced by addChargedTrack(), chargedTrack(), FBaseSimEvent(), and ~FBaseSimEvent().

Definition at line 178 of file FBaseSimEvent.h.

Referenced by addSimVertex(), FBaseSimEvent(), and ~FBaseSimEvent().

std::vector<HepMC::GenParticle*>* FBaseSimEvent::theGenParticles [private]

Definition at line 179 of file FBaseSimEvent.h.

Referenced by addParticles(), embdGenpart(), FBaseSimEvent(), genparts(), and ~FBaseSimEvent().

unsigned int FBaseSimEvent::theGenSize [private]

Definition at line 190 of file FBaseSimEvent.h.

Referenced by addParticles(), and FBaseSimEvent().

std::vector<FSimTrack>* FBaseSimEvent::theSimTracks [private]

Definition at line 176 of file FBaseSimEvent.h.

Referenced by addSimTrack(), FBaseSimEvent(), tracks(), and ~FBaseSimEvent().

std::vector<FSimVertex>* FBaseSimEvent::theSimVertices [private]

Definition at line 177 of file FBaseSimEvent.h.

Referenced by addSimVertex(), FBaseSimEvent(), vertices(), and ~FBaseSimEvent().

unsigned int FBaseSimEvent::theTrackSize [private]

Definition at line 188 of file FBaseSimEvent.h.

Referenced by addSimTrack(), and FBaseSimEvent().

Definition at line 203 of file FBaseSimEvent.h.

Referenced by addParticles(), FBaseSimEvent(), and thePrimaryVertexGenerator().

unsigned int FBaseSimEvent::theVertexSize [private]

Definition at line 189 of file FBaseSimEvent.h.

Referenced by addSimVertex(), and FBaseSimEvent().