CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
G4SimEvent.cc
Go to the documentation of this file.
3 
4 #include "G4SystemOfUnits.hh"
5 
6 class IdSort {
7 public:
8  bool operator()(const SimTrack& a, const SimTrack& b) { return a.trackId() < b.trackId(); }
9 };
10 
12  : hepMCEvent(nullptr),
13  weight_(0),
14  collisionPoint_(math::XYZTLorentzVectorD(0., 0., 0., 0.)),
15  nparam_(0),
16  param_(0) {}
17 
19  // per suggestion by Chris Jones, it's faster
20  // that delete back() and pop_back()
21  //
22  unsigned int i = 0;
23 
24  for (i = 0; i < g4tracks.size(); i++) {
25  delete g4tracks[i];
26  g4tracks[i] = nullptr;
27  }
28  g4tracks.clear();
29 
30  for (i = 0; i < g4vertices.size(); i++) {
31  delete g4vertices[i];
32  g4vertices[i] = nullptr;
33  }
34  g4vertices.clear();
35 }
36 
38  for (unsigned int i = 0; i < g4tracks.size(); i++) {
39  G4SimTrack* trk = g4tracks[i];
40  int ip = trk->part();
42  trk->momentum().x() / GeV, trk->momentum().y() / GeV, trk->momentum().z() / GeV, trk->energy() / GeV);
43  int iv = trk->ivert();
44  int ig = trk->igenpart();
45  int id = trk->id();
46  math::XYZVectorD tkpos(trk->trackerSurfacePosition().x() / cm,
47  trk->trackerSurfacePosition().y() / cm,
48  trk->trackerSurfacePosition().z() / cm);
49  math::XYZTLorentzVectorD tkmom(trk->trackerSurfaceMomentum().x() / GeV,
50  trk->trackerSurfaceMomentum().y() / GeV,
51  trk->trackerSurfaceMomentum().z() / GeV,
52  trk->trackerSurfaceMomentum().e() / GeV);
53  // ip = particle ID as PDG
54  // pp = 4-momentum
55  // iv = corresponding G4SimVertex index
56  // ig = corresponding GenParticle index
57  SimTrack t = SimTrack(ip, p, iv, ig, tkpos, tkmom);
58  t.setTrackId(id);
59  t.setEventId(EncodedEventId(0));
60  if (trk->crossedBoundary())
61  t.setCrossedBoundaryVars(
63  c.push_back(t);
64  }
65  std::stable_sort(c.begin(), c.end(), IdSort());
66 }
67 
69  for (unsigned int i = 0; i < g4vertices.size(); i++) {
70  G4SimVertex* vtx = g4vertices[i];
71  //
72  // starting 1_1_0_pre3, SimVertex stores in cm !!!
73  //
74  math::XYZVectorD v3(vtx->vertexPosition().x() / cm, vtx->vertexPosition().y() / cm, vtx->vertexPosition().z() / cm);
75  float t = vtx->vertexGlobalTime() / second;
76  int iv = vtx->parentIndex();
77  // vv = position
78  // t = global time
79  // iv = index of the parent in the SimEvent SimTrack container (-1 if no parent)
80  SimVertex v = SimVertex(v3, t, iv, i);
81  v.setProcessType(vtx->processType());
83  c.push_back(v);
84  }
85 }
double energy() const
Definition: G4SimTrack.h:65
const edm::EventSetup & c
bool crossedBoundary() const
Definition: G4SimTrack.h:85
int32_t *__restrict__ iv
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
int parentIndex() const
Definition: G4SimVertex.h:17
int part() const
Definition: G4SimTrack.h:63
std::vector< G4SimTrack * > g4tracks
Definition: G4SimEvent.h:44
int ivert() const
Definition: G4SimTrack.h:66
const math::XYZVectorD & trackerSurfacePosition() const
Definition: G4SimTrack.h:71
void setProcessType(unsigned int ty)
Definition: SimVertex.h:35
bool operator()(const SimTrack &a, const SimTrack &b)
Definition: G4SimEvent.cc:8
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
const math::XYZTLorentzVectorF & getPositionAtBoundary() const
Definition: G4SimTrack.h:86
U second(std::pair< T, U > const &p)
unsigned int processType() const
Definition: G4SimVertex.h:18
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > XYZVectorD
spatial vector with cartesian internal representation
Definition: Vector3D.h:8
int getIDAtBoundary() const
Definition: G4SimTrack.h:88
const math::XYZVectorD & vertexPosition() const
index of the parent (-1 if no parent)
Definition: G4SimVertex.h:15
struct @720 param_
void load(edm::SimTrackContainer &c) const
Definition: G4SimEvent.cc:37
const math::XYZTLorentzVectorF & getMomentumAtBoundary() const
Definition: G4SimTrack.h:87
unsigned int trackId() const
Definition: CoreSimTrack.h:31
std::vector< SimVertex > SimVertexContainer
double b
Definition: hdecay.h:118
std::vector< G4SimVertex * > g4vertices
Definition: G4SimEvent.h:45
int igenpart() const
Definition: G4SimTrack.h:67
virtual ~G4SimEvent()
Definition: G4SimEvent.cc:18
int id() const
Definition: G4SimTrack.h:62
double a
Definition: hdecay.h:119
double vertexGlobalTime() const
Definition: G4SimVertex.h:16
const math::XYZTLorentzVectorD & trackerSurfaceMomentum() const
Definition: G4SimTrack.h:72
std::vector< SimTrack > SimTrackContainer
void setEventId(EncodedEventId e)
Definition: CoreSimVertex.h:23
const math::XYZVectorD & momentum() const
Definition: G4SimTrack.h:64