CMS 3D CMS Logo

FBaseSimEvent.cc
Go to the documentation of this file.
1 //HepMC Headers
2 #include "HepMC/GenEvent.h"
3 #include "HepMC/GenVertex.h"
4 #include "HepMC/GenParticle.h"
5 
6 //Framework Headers
8 
9 //CMSSW Data Formats
12 
13 //FAMOS Headers
21 
23 
24 using namespace HepPDT;
25 
26 // system include
27 #include <iostream>
28 #include <iomanip>
29 #include <map>
30 #include <string>
31 
33  :
34  nSimTracks(0),
35  nSimVertices(0),
36  nGenParticles(0),
37  nChargedParticleTracks(0),
38  initialSize(5000)
39 {
40 
41  // Initialize the vectors of particles and vertices
42  theGenParticles = new std::vector<HepMC::GenParticle*>();
43  theSimTracks = new std::vector<FSimTrack>;
44  theSimVertices = new std::vector<FSimVertex>;
45  theChargedTracks = new std::vector<unsigned>();
47 
48  // Reserve some size to avoid mutiple copies
49  /* */
50  theSimTracks->resize(initialSize);
51  theSimVertices->resize(initialSize);
54  theFSimVerticesType->resize(initialSize);
59  /* */
60 
61  // Initialize the Particle filter
62  myFilter = new KineParticleFilter(kine);
63 
64  // Initialize the distance from (0,0,0) after which *generated* particles are
65  // no longer considered - because the mother could have interacted before.
66  // unit : cm x cm
67  lateVertexPosition = 2.5*2.5;
68 }
69 
71 
72  // Clear the vectors
73  theGenParticles->clear();
74  theSimTracks->clear();
75  theSimVertices->clear();
76  theChargedTracks->clear();
77  theFSimVerticesType->clear();
78 
79  // Delete
80  delete theGenParticles;
81  delete theSimTracks;
82  delete theSimVertices;
83  delete theChargedTracks;
84  delete theFSimVerticesType;
85  delete myFilter;
86 
87 }
88 
89 void
91 
92  pdt = aPdt;
93 
94 }
95 
96 void
98 
99  // Clear old vectors
100  clear();
101 
102  // Add the particles in the FSimEvent
103  addParticles(myGenEvent);
104 
105 }
106 
107 void
108 FBaseSimEvent::fill(const std::vector<SimTrack>& simTracks,
109  const std::vector<SimVertex>& simVertices) {
110 
111  // Watch out there ! A SimVertex is in mm (stupid),
112  // while a FSimVertex is in cm (clever).
113 
114  clear();
115 
116  unsigned nVtx = simVertices.size();
117  unsigned nTks = simTracks.size();
118 
119  // Empty event, do nothin'
120  if ( nVtx == 0 ) return;
121 
122  // Two arrays for internal use.
123  std::vector<int> myVertices(nVtx,-1);
124  std::vector<int> myTracks(nTks,-1);
125 
126  // create a map associating geant particle id and position in the
127  // event SimTrack vector
128 
129  std::map<unsigned, unsigned> geantToIndex;
130  for( unsigned it=0; it<simTracks.size(); ++it ) {
131  geantToIndex[ simTracks[it].trackId() ] = it;
132  }
133 
134  // Create also a map associating a SimTrack with its endVertex
135  /*
136  std::map<unsigned, unsigned> endVertex;
137  for ( unsigned iv=0; iv<simVertices.size(); ++iv ) {
138  endVertex[ simVertices[iv].parentIndex() ] = iv;
139  }
140  */
141 
142  // Set the main vertex for the kine particle filter
143  // SimVertices were in mm until 110_pre2
144  // HepLorentzVector primaryVertex = simVertices[0].position()/10.;
145  // SImVertices are now in cm
146  // Also : position is copied until SimVertex switches to Mathcore.
147  // XYZTLorentzVector primaryVertex = simVertices[0].position();
148  // The next 5 lines to be then replaced by the previous line
149  XYZTLorentzVector primaryVertex(simVertices[0].position().x(),
150  simVertices[0].position().y(),
151  simVertices[0].position().z(),
152  simVertices[0].position().t());
153  //
154  //myFilter->setMainVertex(primaryVertex);
155  // Add the main vertex to the list.
156  addSimVertex(/*myFilter->vertex()*/primaryVertex, -1, FSimVertexType::PRIMARY_VERTEX);
157  myVertices[0] = 0;
158 
159  for( unsigned trackId=0; trackId<nTks; ++trackId ) {
160 
161  // The track
162  const SimTrack& track = simTracks[trackId];
163  // std::cout << std::endl << "SimTrack " << trackId << " " << track << std::endl;
164 
165  // The origin vertex
166  int vertexId = track.vertIndex();
167  const SimVertex& vertex = simVertices[vertexId];
168  //std::cout << "Origin vertex " << vertexId << " " << vertex << std::endl;
169 
170  // The mother track
171  int motherId = -1;
172  if( !vertex.noParent() ) { // there is a parent to this vertex
173  // geant id of the mother
174  unsigned motherGeantId = vertex.parentIndex();
175  std::map<unsigned, unsigned >::iterator association
176  = geantToIndex.find( motherGeantId );
177  if(association != geantToIndex.end() )
178  motherId = association->second;
179  }
180  int originId = motherId == - 1 ? -1 : myTracks[motherId];
181  //std::cout << "Origin id " << originId << std::endl;
182 
183  /*
184  if ( endVertex.find(trackId) != endVertex.end() )
185  std::cout << "End vertex id = " << endVertex[trackId] << std::endl;
186  else
187  std::cout << "No endVertex !!! " << std::endl;
188  std::cout << "Tracker surface position " << track.trackerSurfacePosition() << std::endl;
189  */
190 
191  // Add the vertex (if it does not already exist!)
192  XYZTLorentzVector position(vertex.position().px(),vertex.position().py(),
193  vertex.position().pz(),vertex.position().e());
194  if ( myVertices[vertexId] == -1 )
195  // Momentum and position are copied until SimTrack and SimVertex
196  // switch to Mathcore.
197  // myVertices[vertexId] = addSimVertex(vertex.position(),originId);
198  // The next line to be then replaced by the previous line
199  myVertices[vertexId] = addSimVertex(position,originId);
200 
201  // Add the track (with protection for brem'ing electrons and muons)
202  int motherType = motherId == -1 ? 0 : simTracks[motherId].type();
203 
204  bool notBremInDetector =
205  (abs(motherType) != 11 && std::abs(motherType) != 13) ||
206  motherType != track.type() ||
207  position.Perp2() < lateVertexPosition ;
208 
209  if ( notBremInDetector ) {
210  // Momentum and position are copied until SimTrack and SimVertex
211  // switch to Mathcore.
212  // RawParticle part(track.momentum(), vertex.position());
213  // The next 3 lines to be then replaced by the previous line
214  XYZTLorentzVector momentum(track.momentum().px(),track.momentum().py(),
215  track.momentum().pz(),track.momentum().e());
216  RawParticle part = makeParticle(theTable(),track.type(),momentum,position);
217  //
218  //std::cout << "Ctau = " << part.PDGcTau() << std::endl;
219  // Don't save tracks that have decayed immediately but for which no daughters
220  // were saved (probably due to cuts on E, pT and eta)
221  // if ( part.PDGcTau() > 0.1 || endVertex.find(trackId) != endVertex.end() )
222  myTracks[trackId] = addSimTrack(&part,myVertices[vertexId],track.genpartIndex());
223  if ( myTracks[trackId] >= 0 ) {
224  (*theSimTracks)[ myTracks[trackId] ].setTkPosition(track.trackerSurfacePosition());
225  (*theSimTracks)[ myTracks[trackId] ].setTkMomentum(track.trackerSurfaceMomentum());
226  }
227  } else {
228 
229  myTracks[trackId] = myTracks[motherId];
230  if ( myTracks[trackId] >= 0 ) {
231  (*theSimTracks)[ myTracks[trackId] ].setTkPosition(track.trackerSurfacePosition());
232  (*theSimTracks)[ myTracks[trackId] ].setTkMomentum(track.trackerSurfaceMomentum());
233  }
234  }
235 
236  }
237 
238  // Now loop over the remaining end vertices !
239  for( unsigned vertexId=0; vertexId<nVtx; ++vertexId ) {
240 
241  // if the vertex is already saved, just ignore.
242  if ( myVertices[vertexId] != -1 ) continue;
243 
244  // The yet unused vertex
245  const SimVertex& vertex = simVertices[vertexId];
246 
247  // The mother track
248  int motherId = -1;
249  if( !vertex.noParent() ) { // there is a parent to this vertex
250 
251  // geant id of the mother
252  unsigned motherGeantId = vertex.parentIndex();
253  std::map<unsigned, unsigned >::iterator association
254  = geantToIndex.find( motherGeantId );
255  if(association != geantToIndex.end() )
256  motherId = association->second;
257  }
258  int originId = motherId == - 1 ? -1 : myTracks[motherId];
259 
260  // Add the vertex
261  // Momentum and position are copied until SimTrack and SimVertex
262  // switch to Mathcore.
263  // myVertices[vertexId] = addSimVertex(vertex.position(),originId);
264  // The next 3 lines to be then replaced by the previous line
265  XYZTLorentzVector position(vertex.position().px(),vertex.position().py(),
266  vertex.position().pz(),vertex.position().e());
267  myVertices[vertexId] = addSimVertex(position,originId);
268  }
269 
270  // Finally, propagate all particles to the calorimeters
271  BaseParticlePropagator myPart;
272  XYZTLorentzVector mom;
274 
275 
276  // Loop over the tracks
277  for( int fsimi=0; fsimi < (int)nTracks() ; ++fsimi) {
278 
279 
280  FSimTrack& myTrack = track(fsimi);
281  double trackerSurfaceTime = myTrack.vertex().position().t()
282  + myTrack.momentum().e()/myTrack.momentum().pz()
283  * ( myTrack.trackerSurfacePosition().z()
284  - myTrack.vertex().position().z() );
285  pos = XYZTLorentzVector(myTrack.trackerSurfacePosition().x(),
286  myTrack.trackerSurfacePosition().y(),
287  myTrack.trackerSurfacePosition().z(),
288  trackerSurfaceTime);
289  mom = XYZTLorentzVector(myTrack.trackerSurfaceMomentum().x(),
290  myTrack.trackerSurfaceMomentum().y(),
291  myTrack.trackerSurfaceMomentum().z(),
292  myTrack.trackerSurfaceMomentum().t());
293 
294  if ( mom.T() > 0. ) {
295  // The particle to be propagated
296  myPart = BaseParticlePropagator(RawParticle(mom,pos,myTrack.charge()),0.,0.,4.);
297 
298  // Propagate to Preshower layer 1
299  myPart.propagateToPreshowerLayer1(false);
300  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) && myPart.getSuccess()>0 )
301  myTrack.setLayer1(myPart.particle(),myPart.getSuccess());
302 
303  // Propagate to Preshower Layer 2
304  myPart.propagateToPreshowerLayer2(false);
305  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) && myPart.getSuccess()>0 )
306  myTrack.setLayer2(myPart.particle(),myPart.getSuccess());
307 
308  // Propagate to Ecal Endcap
309  myPart.propagateToEcalEntrance(false);
310  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) )
311  myTrack.setEcal(myPart.particle(),myPart.getSuccess());
312 
313  // Propagate to HCAL entrance
314  myPart.propagateToHcalEntrance(false);
315  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) )
316  myTrack.setHcal(myPart.particle(),myPart.getSuccess());
317 
318  // Attempt propagation to HF for low pt and high eta
319  if ( myPart.particle().cos2ThetaV()>0.8 || mom.T() < 3. ) {
320  // Propagate to VFCAL entrance
321  myPart.propagateToVFcalEntrance(false);
322  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) )
323  myTrack.setVFcal(myPart.particle(),myPart.getSuccess());
324 
325  // Otherwise propagate to the HCAL exit and HO.
326  } else {
327  // Propagate to HCAL exit
328  myPart.propagateToHcalExit(false);
329  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) )
330  myTrack.setHcalExit(myPart.particle(),myPart.getSuccess());
331  // Propagate to HOLayer entrance
332  myPart.setMagneticField(0);
333  myPart.propagateToHOLayer(false);
334  if ( myTrack.notYetToEndVertex(myPart.particle().vertex()) )
335  myTrack.setHO(myPart.particle(),myPart.getSuccess());
336  }
337  }
338  }
339 }
340 
341 void
343 
345  int genEventSize = myGenEvent.particles_size();
346  std::vector<int> myGenVertices(genEventSize, static_cast<int>(0));
347 
348  // If no particles, no work to be done !
349  if ( myGenEvent.particles_empty() ) return;
350 
351  // Are there particles in the FSimEvent already ?
352  int offset = nGenParts();
353 
354  // Primary vertex
355  HepMC::GenVertex* primaryVertex = *(myGenEvent.vertices_begin());
356 
357  // unit transformation (needs review)
358  XYZTLorentzVector primaryVertexPosition(primaryVertex->position().x()/10.,
359  primaryVertex->position().y()/10.,
360  primaryVertex->position().z()/10.,
361  primaryVertex->position().t()/10.);
362 
363  // This is the main vertex index
364  int mainVertex = addSimVertex(primaryVertexPosition, -1, FSimVertexType::PRIMARY_VERTEX);
365 
366  int initialBarcode = 0;
367  if ( myGenEvent.particles_begin() != myGenEvent.particles_end() )
368  {
369  initialBarcode = (*myGenEvent.particles_begin())->barcode();
370  }
371 
372  // Loop on the particles of the generated event
373  for ( auto piter = myGenEvent.particles_begin(); piter != myGenEvent.particles_end(); ++piter )
374  {
375 
376  // This is the generated particle pointer - for the signal event only
377  HepMC::GenParticle* p = *piter;
378 
379  if ( !offset ) {
380  (*theGenParticles)[nGenParticles++] = p;
382  theGenSize *= 2;
383  theGenParticles->resize(theGenSize);
384  }
385 
386  }
387 
388  // Reject particles with late origin vertex (i.e., coming from late decays)
389  // This should not happen, but one never knows what users may be up to!
390  // For example exotic particles might decay late - keep the decay products in the case.
391  XYZTLorentzVector productionVertexPosition(0.,0.,0.,0.);
392  HepMC::GenVertex* productionVertex = p->production_vertex();
393  if ( productionVertex ) {
394  unsigned productionMother = productionVertex->particles_in_size();
395  if ( productionMother ) {
396  unsigned motherId = (*(productionVertex->particles_in_const_begin()))->pdg_id();
397  if ( motherId < 1000000 )
398  productionVertexPosition =
399  XYZTLorentzVector(productionVertex->position().x()/10.,
400  productionVertex->position().y()/10.,
401  productionVertex->position().z()/10.,
402  productionVertex->position().t()/10.);
403  }
404  }
405  if ( !myFilter->acceptVertex(productionVertexPosition) ) continue;
406 
407  int abspdgId = std::abs(p->pdg_id());
408  HepMC::GenVertex* endVertex = p->end_vertex();
409 
410  // Keep only:
411  // 1) Stable particles (watch out! New status code = 1001!)
412  bool testStable = p->status()%1000==1;
413  // Declare stable standard particles that decay after a macroscopic path length
414  // (except if exotic)
415  if ( p->status() == 2 && abspdgId < 1000000) {
416  if ( endVertex ) {
417  XYZTLorentzVector decayPosition =
418  XYZTLorentzVector(endVertex->position().x()/10.,
419  endVertex->position().y()/10.,
420  endVertex->position().z()/10.,
421  endVertex->position().t()/10.);
422  // If the particle flew enough to be beyond the beam pipe enveloppe, just declare it stable
423  if ( decayPosition.Perp2() > lateVertexPosition ) testStable = true;
424  }
425  }
426 
427  // 2) or particles with stable daughters (watch out! New status code = 1001!)
428  bool testDaugh = false;
429  if ( !testStable &&
430  p->status() == 2 &&
431  endVertex &&
432  endVertex->particles_out_size() ) {
433  HepMC::GenVertex::particles_out_const_iterator firstDaughterIt =
434  endVertex->particles_out_const_begin();
435  HepMC::GenVertex::particles_out_const_iterator lastDaughterIt =
436  endVertex->particles_out_const_end();
437  for ( ; firstDaughterIt != lastDaughterIt ; ++firstDaughterIt ) {
438  HepMC::GenParticle* daugh = *firstDaughterIt;
439  if ( daugh->status()%1000==1 ) {
440  // Check that it is not a "prompt electron or muon brem":
441  if (abspdgId == 11 || abspdgId == 13) {
442  if ( endVertex ) {
443  XYZTLorentzVector endVertexPosition = XYZTLorentzVector(endVertex->position().x()/10.,
444  endVertex->position().y()/10.,
445  endVertex->position().z()/10.,
446  endVertex->position().t()/10.);
447  // If the particle flew enough to be beyond the beam pipe enveloppe, just declare it stable
448  if ( endVertexPosition.Perp2() < lateVertexPosition ) {
449  break;
450  }
451  }
452  }
453  testDaugh=true;
454  break;
455  }
456  }
457  }
458 
459  // 3) or particles that fly more than one micron.
460  double dist = 0.;
461  if ( !testStable && !testDaugh && p->production_vertex() ) {
463  productionVertexPosition(p->production_vertex()->position().x()/10.,
464  p->production_vertex()->position().y()/10.,
465  p->production_vertex()->position().z()/10.,
466  p->production_vertex()->position().t()/10.);
467  dist = (primaryVertexPosition-productionVertexPosition).Vect().Mag2();
468  }
469  bool testDecay = ( dist > 1e-8 ) ? true : false;
470 
471  // Save the corresponding particle and vertices
472  if ( testStable || testDaugh || testDecay ) {
473 
474  /*
475  const HepMC::GenParticle* mother = p->production_vertex() ?
476  *(p->production_vertex()->particles_in_const_begin()) : 0;
477  */
478 
479  int motherBarcode = p->production_vertex() &&
480  p->production_vertex()->particles_in_const_begin() !=
481  p->production_vertex()->particles_in_const_end() ?
482  (*(p->production_vertex()->particles_in_const_begin()))->barcode() : 0;
483 
484  int originVertex =
485  motherBarcode && myGenVertices[motherBarcode-initialBarcode] ?
486  myGenVertices[motherBarcode-initialBarcode] : mainVertex;
487 
488  XYZTLorentzVector momentum(p->momentum().px(),
489  p->momentum().py(),
490  p->momentum().pz(),
491  p->momentum().e());
492  RawParticle part= makeParticle(theTable(),p->pdg_id(),momentum, vertex(originVertex).position());
493 
494  // Add the particle to the event and to the various lists
495 
496  int theTrack = testStable && p->end_vertex() ?
497  // The particle is scheduled to decay
498  addSimTrack(&part,originVertex, nGenParts()-offset,p->end_vertex()) :
499  // The particle is not scheduled to decay
500  addSimTrack(&part,originVertex, nGenParts()-offset);
501 
502  if (
503  // This one deals with particles with no end vertex
504  !p->end_vertex() ||
505  // This one deals with particles that have a pre-defined
506  // decay proper time, but have not decayed yet
507  ( testStable && p->end_vertex() && !p->end_vertex()->particles_out_size() )
508  // In both case, just don't add a end vertex in the FSimEvent
509  ) continue;
510 
511  // Add the vertex to the event and to the various lists
512  XYZTLorentzVector decayVertex =
513  XYZTLorentzVector(p->end_vertex()->position().x()/10.,
514  p->end_vertex()->position().y()/10.,
515  p->end_vertex()->position().z()/10.,
516  p->end_vertex()->position().t()/10.);
517  // vertex(mainVertex).position();
518  int theVertex = addSimVertex(decayVertex,theTrack, FSimVertexType::DECAY_VERTEX);
519 
520  if ( theVertex != -1 ) myGenVertices[p->barcode()-initialBarcode] = theVertex;
521 
522  // There we are !
523  }
524  }
525 
526 }
527 
528 int
529 FBaseSimEvent::addSimTrack(const RawParticle* p, int iv, int ig,
530  const HepMC::GenVertex* ev) {
531 
532  // Check that the particle is in the Famos "acceptance"
533  // Keep all primaries of pile-up events, though
534  if ( !myFilter->acceptParticle(*p) && ig >= -1 ) return -1;
535 
536  // The new track index
537  int trackId = nSimTracks++;
539  theTrackSize *= 2;
540  theSimTracks->resize(theTrackSize);
541  }
542 
543  // Attach the particle to the origin vertex, and to the mother
544  vertex(iv).addDaughter(trackId);
545  if ( !vertex(iv).noParent() ) {
546  track(vertex(iv).parent().id()).addDaughter(trackId);
547 
548  if ( ig == -1 ) {
549  int motherId = track(vertex(iv).parent().id()).genpartIndex();
550  if ( motherId < -1 ) ig = motherId;
551  }
552  }
553 
554  // Some transient information for FAMOS internal use
555  (*theSimTracks)[trackId] = ev ?
556  // A proper decay time is scheduled
557  FSimTrack(p,iv,ig,trackId,this,
558  ev->position().t()/10.
559  * pdg::mass(p->pid(), theTable())
560  / std::sqrt(p->momentum().Vect().Mag2())) :
561  // No proper decay time is scheduled
562  FSimTrack(p,iv,ig,trackId,this);
563 
564  return trackId;
565 
566 }
567 
568 int
570 
571  // Check that the vertex is in the Famos "acceptance"
572  if ( !myFilter->acceptVertex(v) ) return -1;
573 
574  // The number of vertices
575  int vertexId = nSimVertices++;
577  theVertexSize *= 2;
578  theSimVertices->resize(theVertexSize);
580  }
581 
582  // Attach the end vertex to the particle (if accepted)
583  if ( im !=-1 ) track(im).setEndVertex(vertexId);
584 
585  // Some transient information for FAMOS internal use
586  (*theSimVertices)[vertexId] = FSimVertex(v,im,vertexId,this);
587 
588  (*theFSimVerticesType)[vertexId] = FSimVertexType(type);
589 
590  return vertexId;
591 
592 }
593 
594 void
596 
597  std::cout << "Id Gen Name eta phi pT E Vtx1 "
598  << " x y z "
599  << "Moth Vtx2 eta phi R Z Da1 Da2 Ecal?" << std::endl;
600 
601  for ( HepMC::GenEvent::particle_const_iterator
602  piter = myGenEvent.particles_begin();
603  piter != myGenEvent.particles_end();
604  ++piter ) {
605 
606  HepMC::GenParticle* p = *piter;
607  /* */
608  int partId = p->pdg_id();
610 
611  if ( pdt->particle(ParticleID(partId)) !=nullptr ) {
612  name = (pdt->particle(ParticleID(partId)))->name();
613  } else {
614  name = "none";
615  }
616 
617  XYZTLorentzVector momentum1(p->momentum().px(),
618  p->momentum().py(),
619  p->momentum().pz(),
620  p->momentum().e());
621 
622  int vertexId1 = 0;
623 
624  if ( !p->production_vertex() ) continue;
625 
626  XYZVector vertex1 (p->production_vertex()->position().x()/10.,
627  p->production_vertex()->position().y()/10.,
628  p->production_vertex()->position().z()/10.);
629  vertexId1 = p->production_vertex()->barcode();
630 
631  std::cout.setf(std::ios::fixed, std::ios::floatfield);
632  std::cout.setf(std::ios::right, std::ios::adjustfield);
633 
634  std::cout << std::setw(4) << p->barcode() << " "
635  << name;
636 
637  for(unsigned int k=0;k<11-name.length() && k<12; k++) std::cout << " ";
638 
639  double eta = momentum1.eta();
640  if ( eta > +10. ) eta = +10.;
641  if ( eta < -10. ) eta = -10.;
642  std::cout << std::setw(6) << std::setprecision(2) << eta << " "
643  << std::setw(6) << std::setprecision(2) << momentum1.phi() << " "
644  << std::setw(7) << std::setprecision(2) << momentum1.pt() << " "
645  << std::setw(7) << std::setprecision(2) << momentum1.e() << " "
646  << std::setw(4) << vertexId1 << " "
647  << std::setw(6) << std::setprecision(1) << vertex1.x() << " "
648  << std::setw(6) << std::setprecision(1) << vertex1.y() << " "
649  << std::setw(6) << std::setprecision(1) << vertex1.z() << " ";
650 
651  const HepMC::GenParticle* mother =
652  *(p->production_vertex()->particles_in_const_begin());
653 
654  if ( mother )
655  std::cout << std::setw(4) << mother->barcode() << " ";
656  else
657  std::cout << " " ;
658 
659  if ( p->end_vertex() ) {
660  XYZTLorentzVector vertex2(p->end_vertex()->position().x()/10.,
661  p->end_vertex()->position().y()/10.,
662  p->end_vertex()->position().z()/10.,
663  p->end_vertex()->position().t()/10.);
664  int vertexId2 = p->end_vertex()->barcode();
665 
666  std::vector<const HepMC::GenParticle*> children;
667  HepMC::GenVertex::particles_out_const_iterator firstDaughterIt =
668  p->end_vertex()->particles_out_const_begin();
669  HepMC::GenVertex::particles_out_const_iterator lastDaughterIt =
670  p->end_vertex()->particles_out_const_end();
671  for ( ; firstDaughterIt != lastDaughterIt ; ++firstDaughterIt ) {
672  children.push_back(*firstDaughterIt);
673  }
674 
675  std::cout << std::setw(4) << vertexId2 << " "
676  << std::setw(6) << std::setprecision(2) << vertex2.eta() << " "
677  << std::setw(6) << std::setprecision(2) << vertex2.phi() << " "
678  << std::setw(5) << std::setprecision(1) << vertex2.pt() << " "
679  << std::setw(6) << std::setprecision(1) << vertex2.z() << " ";
680  for ( unsigned id=0; id<children.size(); ++id )
681  std::cout << std::setw(4) << children[id]->barcode() << " ";
682  }
683  std::cout << std::endl;
684 
685  }
686 
687 }
688 
689 void
691 
692  std::cout << " Id Gen Name eta phi pT E Vtx1 "
693  << " x y z "
694  << "Moth Vtx2 eta phi R Z Daughters Ecal?" << std::endl;
695 
696  for( int i=0; i<(int)nTracks(); i++ )
697  std::cout << track(i) << std::endl;
698 
699  for( int i=0; i<(int)nVertices(); i++ )
700  std::cout << "i = " << i << " " << vertexType(i) << std::endl;
701 
702 
703 
704 }
705 
706 void
708 
709  nSimTracks = 0;
710  nSimVertices = 0;
711  nGenParticles = 0;
713 
714 }
715 
716 void
718  (*theChargedTracks)[nChargedParticleTracks++] = id;
721  theChargedSize *= 2;
723  }
724 }
725 
726 int
728  if (id>=0 && id<(int)nChargedParticleTracks)
729  return (*theChargedTracks)[id];
730  else
731  return -1;
732 }
733 
734 const HepMC::GenParticle*
736  return (*theGenParticles)[i];
737 }
738 
const ParticleDataTable * pdt
double lateVertexPosition
type
Definition: HCALResponse.h:21
const math::XYZVectorD & trackerSurfacePosition() const
Definition: SimTrack.h:37
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.
float charge() const
charge
Definition: FSimTrack.h:51
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.
bool propagateToPreshowerLayer1(bool first=true)
const HepMC::GenParticle * embdGenpart(int i) const
return MC track with a given id
HepPDT::ParticleDataTable ParticleDataTable
std::vector< FSimTrack > * theSimTracks
std::vector< unsigned > * theChargedTracks
FBaseSimEvent(const edm::ParameterSet &kine)
Default constructor.
const XYZTLorentzVector & momentum() const
Temporary (until move of SimTrack to Mathcore) - No! Actually very useful.
Definition: FSimTrack.h:204
unsigned int theTrackSize
unsigned int theVertexSize
KineParticleFilter * myFilter
The particle filter.
const HepPDT::ParticleDataTable * theTable() const
Get the pointer to the particle data table.
Definition: FBaseSimEvent.h:57
#define nullptr
void setEcal(const RawParticle &pp, int success)
Set the ecal variables.
Definition: FSimTrack.cc:81
int getSuccess() const
Has propagation been performed and was barrel or endcap reached ?
void addParticles(const HepMC::GenEvent &hev)
Add the particles and their vertices to the list.
int pid() const
get the HEP particle ID number
Definition: RawParticle.h:296
void setLayer2(const RawParticle &pp, int success)
Set the preshower layer2 variables.
Definition: FSimTrack.cc:74
void clear()
clear the FBaseSimEvent content before the next event
bool ev
void setMagneticField(double b)
Set the magnetic field.
unsigned int nSimTracks
RawParticle const & particle() const
The particle being propagated.
unsigned int theGenSize
bool notYetToEndVertex(const XYZTLorentzVector &pos) const
Compare the end vertex position with another position.
Definition: FSimTrack.cc:45
FSimVertex & vertex(int id) const
Return vertex with given Id.
unsigned int nVertices() const
Number of vertices.
Definition: FBaseSimEvent.h:89
RawParticle makeParticle(HepPDT::ParticleDataTable const *, int id, const math::XYZTLorentzVector &p)
Definition: makeParticle.cc:29
FSimVertexType & vertexType(int id) const
Return vertex with given Id.
bool propagateToVFcalEntrance(bool first=true)
void setLayer1(const RawParticle &pp, int success)
Set the preshower layer1 variables.
Definition: FSimTrack.cc:67
const XYZTLorentzVector & momentum() const
the momentum fourvector
Definition: RawParticle.h:340
double t() const
vertex time
Definition: RawParticle.h:304
int parentIndex() const
Definition: SimVertex.h:29
~FBaseSimEvent()
usual virtual destructor
const math::XYZTLorentzVector & position() const
Temporary (until CMSSW moves to Mathcore) - No ! Actually very useful.
Definition: FSimVertex.h:49
T sqrt(T t)
Definition: SSEVec.h:18
unsigned int nTracks() const
Number of tracks.
Definition: FBaseSimEvent.h:84
bool propagateToHcalExit(bool first=true)
unsigned int nSimVertices
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
Definition: SimTrack.h:34
double cos2ThetaV() const
Definition: RawParticle.h:300
A FSimVertexType hold the information on the vertex origine.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const math::XYZTLorentzVectorD & position() const
Definition: CoreSimVertex.h:21
std::vector< FSimVertexType > FSimVertexTypeCollection
collection of FSimVertexType objects
unsigned int nGenParticles
unsigned int initialSize
std::vector< FSimVertex > * theSimVertices
bool propagateToEcalEntrance(bool first=true)
int k[5][pyjets_maxn]
void fill(const HepMC::GenEvent &hev)
fill the FBaseSimEvent from the current HepMC::GenEvent
int vertIndex() const
index of the vertex in the Event container (-1 if no vertex)
Definition: SimTrack.h:30
const XYZTLorentzVector & vertex() const
the vertex fourvector
Definition: RawParticle.h:339
unsigned int theChargedSize
part
Definition: HCALResponse.h:20
const math::XYZTLorentzVectorD & trackerSurfaceMomentum() const
Definition: SimTrack.h:39
void addChargedTrack(int id)
Add an id in the vector of charged tracks id&#39;s.
void setHcalExit(const RawParticle &pp, int success)
Set the hcal exit variables.
Definition: FSimTrack.cc:102
unsigned int nChargedParticleTracks
int type() const
particle type (HEP PDT convension)
Definition: CoreSimTrack.h:22
bool propagateToHcalEntrance(bool first=true)
void initializePdt(const HepPDT::ParticleDataTable *aPdt)
Initialize the particle data table.
void setEndVertex(int endv)
Set the end vertex.
Definition: FSimTrack.h:162
unsigned int nGenParts() const
Number of generator particles.
Definition: FBaseSimEvent.h:94
const math::XYZTLorentzVectorD & momentum() const
Definition: CoreSimTrack.h:19
static int position[264][3]
Definition: ReadPGInfo.cc:509
double mass(int pdgID, const HepPDT::ParticleDataTable *pdt)
void addDaughter(int i)
Add a RecHit for a track on a layer.
Definition: FSimTrack.h:195
void setHO(const RawParticle &pp, int success)
Set the ho variables.
Definition: FSimTrack.cc:108
int chargedTrack(int id) const
return "reconstructed" charged tracks index.
void setVFcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:95
void addDaughter(int i)
Definition: FSimVertex.h:46
void setHcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:88
const FSimVertex vertex() const
Origin vertex.
bool noParent() const
Definition: SimVertex.h:30
void printMCTruth(const HepMC::GenEvent &hev)
print the original MCTruth event
std::vector< HepMC::GenParticle * > * theGenParticles
math::XYZVector XYZVector
Definition: RawParticle.h:28
bool propagateToHOLayer(bool first=true)
bool propagateToPreshowerLayer2(bool first=true)
math::XYZTLorentzVector XYZTLorentzVector
Definition: RawParticle.h:27
void print() const
print the FBaseSimEvent in an intelligible way
FSimTrack & track(int id) const
Return track with given Id.
FSimVertexTypeCollection * theFSimVerticesType