CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackingTruthProducer.cc
Go to the documentation of this file.
1 
11 
14 
18 
20 
25 
27  pSimHitSelector_(config), pixelPSimHitSelector_(config), trackerPSimHitSelector_(config), muonPSimHitSelector_(config)
28 {
29  // Initialize global parameters
30  dataLabels_ = config.getParameter<std::vector<std::string> >("HepMCDataLabels");
31  useMultipleHepMCLabels_ = config.getParameter<bool>("useMultipleHepMCLabels");
32 
33  distanceCut_ = config.getParameter<double>("vertexDistanceCut");
34  volumeRadius_ = config.getParameter<double>("volumeRadius");
35  volumeZ_ = config.getParameter<double>("volumeZ");
36  mergedBremsstrahlung_ = config.getParameter<bool>("mergedBremsstrahlung");
37  removeDeadModules_ = config.getParameter<bool>("removeDeadModules");
38  simHitLabel_ = config.getParameter<std::string>("simHitLabel");
39 
40  // Initialize selection for building TrackingParticles
41  if ( config.exists("select") )
42  {
43  edm::ParameterSet param = config.getParameter<edm::ParameterSet>("select");
45  param.getParameter<double>("ptMinTP"),
46  param.getParameter<double>("minRapidityTP"),
47  param.getParameter<double>("maxRapidityTP"),
48  param.getParameter<double>("tipTP"),
49  param.getParameter<double>("lipTP"),
50  param.getParameter<int>("minHitTP"),
51  param.getParameter<bool>("signalOnlyTP"),
52  param.getParameter<bool>("chargedOnlyTP"),
53  param.getParameter<bool>("stableOnlyTP"),
54  param.getParameter<std::vector<int> >("pdgIdTP")
55  );
56  selectorFlag_ = true;
57  }
58  else
59  selectorFlag_ = false;
60 
61  MessageCategory_ = "TrackingTruthProducer";
62 
63  edm::LogInfo (MessageCategory_) << "Setting up TrackingTruthProducer";
64  edm::LogInfo (MessageCategory_) << "Vertex distance cut set to " << distanceCut_ << " mm";
65  edm::LogInfo (MessageCategory_) << "Volume radius set to " << volumeRadius_ << " mm";
66  edm::LogInfo (MessageCategory_) << "Volume Z set to " << volumeZ_ << " mm";
67 
68  if (useMultipleHepMCLabels_) edm::LogInfo (MessageCategory_) << "Collecting generator information from pileup.";
69  if (mergedBremsstrahlung_) edm::LogInfo (MessageCategory_) << "Merging electrom bremsstralung";
70  if (removeDeadModules_) edm::LogInfo (MessageCategory_) << "Removing psimhit from dead modules";
71 
72  if (!mergedBremsstrahlung_)
73  {
74  produces<TrackingVertexCollection>();
75  produces<TrackingParticleCollection>();
76  }
77  else
78  {
79  produces<TrackingVertexCollection>();
80  produces<TrackingParticleCollection>();
81  produces<TrackingVertexCollection>("MergedTrackTruth");
82  produces<TrackingParticleCollection>("MergedTrackTruth");
83  }
84 }
85 
86 
88 {
89  // Clean the list of hepmc products
90  hepMCProducts_.clear();
91 
92  // Collect all the HepMCProducts
94 
95  for (std::vector<std::string>::const_iterator source = dataLabels_.begin(); source != dataLabels_.end(); ++source)
96  {
97  if ( event.getByLabel(*source, hepMCHandle) )
98  {
99  hepMCProducts_.push_back(hepMCHandle);
100  edm::LogInfo (MessageCategory_) << "Using HepMC source " << *source;
101  if (!useMultipleHepMCLabels_) break;
102  }
103  }
104 
105  if ( hepMCProducts_.empty() )
106  {
107  edm::LogWarning (MessageCategory_) << "No HepMC source found";
108  return;
109  }
110  else if (hepMCProducts_.size() > 1 || useMultipleHepMCLabels_)
111  {
112  edm::LogInfo (MessageCategory_) << "You are using more than one HepMC source.";
113  edm::LogInfo (MessageCategory_) << "If the labels are not in the same order as the events in the crossing frame (i.e. signal, pileup(s) ) ";
114  edm::LogInfo (MessageCategory_) << "or there are fewer labels than events in the crossing frame";
115  edm::LogInfo (MessageCategory_) << MessageCategory_ << " may try to access data in the wrong HepMCProduct and crash.";
116  }
117 
118  // Collect all the simtracks from the crossing frame
120  event.getByLabel("mix", simHitLabel_, cfSimTracks);
121 
122  // Create a mix collection from one simtrack collection
123  simTracks_ = std::auto_ptr<MixCollection<SimTrack> >( new MixCollection<SimTrack>(cfSimTracks.product()) );
124 
125  // Collect all the simvertex from the crossing frame
126  edm::Handle<CrossingFrame<SimVertex> > cfSimVertexes;
127  event.getByLabel("mix", simHitLabel_, cfSimVertexes);
128 
129  // Create a mix collection from one simvertex collection
130  simVertexes_ = std::auto_ptr<MixCollection<SimVertex> >( new MixCollection<SimVertex>(cfSimVertexes.product()) );
131 
132  // Create collections of things we will put in event
133  trackingParticles_ = std::auto_ptr<TrackingParticleCollection>( new TrackingParticleCollection );
134  trackingVertexes_ = std::auto_ptr<TrackingVertexCollection>( new TrackingVertexCollection );
135 
136  // Get references before put so we can cross reference
137  refTrackingParticles_ = event.getRefBeforePut<TrackingParticleCollection>();
138  refTrackingVertexes_ = event.getRefBeforePut<TrackingVertexCollection>();
139 
140  // Create a list of psimhits
141  if (removeDeadModules_)
142  {
143  pSimHits_.clear();
144  pixelPSimHitSelector_.select(pSimHits_, event, setup);
146  muonPSimHitSelector_.select(pSimHits_, event, setup);
147  }
148  else
149  {
150  pSimHits_.clear();
151  pSimHitSelector_.select(pSimHits_, event, setup);
152  }
153 
154  // Create a multimap between trackId and hit indices
156 
157  // Create a map between trackId and track index
159 
160  // Create a map between vertexId and vertex index
162 
164 
166  {
167  // Create collections of things we will put in event,
168  mergedTrackingParticles_ = std::auto_ptr<TrackingParticleCollection>( new TrackingParticleCollection );
169  mergedTrackingVertexes_ = std::auto_ptr<TrackingVertexCollection>( new TrackingVertexCollection );
170 
171  // Get references before put so we can cross reference
172  refMergedTrackingParticles_ = event.getRefBeforePut<TrackingParticleCollection>("MergedTrackTruth");
173  refMergedTrackingVertexes_ = event.getRefBeforePut<TrackingVertexCollection>("MergedTrackTruth");
174 
175  // Merged brem electrons
177 
178  // Put TrackingParticles and TrackingVertices in event
179  event.put(mergedTrackingParticles_, "MergedTrackTruth");
180  event.put(mergedTrackingVertexes_, "MergedTrackTruth");
181  event.put(trackingParticles_);
182  event.put(trackingVertexes_);
183  }
184  else
185  {
186  // Put TrackingParticles and TrackingVertices in event
187  event.put(trackingParticles_);
188  event.put(trackingVertexes_);
189  }
190 }
191 
192 
194  std::vector<PSimHit> const & pSimHits,
195  EncodedTruthIdToIndexes & association
196 )
197 {
198  // Clear the association map
199  association.clear();
200 
201  // Create a association from simtracks to overall index in the mix collection
202  for (std::size_t i = 0; i < pSimHits.size(); ++i)
203  {
204  EncodedTruthIdToIndexes::key_type objectId = EncodedTruthIdToIndexes::key_type(pSimHits[i].eventId(), pSimHits[i].trackId());
205  association.insert( std::make_pair(objectId, i) );
206  }
207 }
208 
209 
211  std::auto_ptr<MixCollection<SimTrack> > const & mixCollection,
212  EncodedTruthIdToIndex & association
213 )
214 {
215  int index = 0;
216  // Clear the association map
217  association.clear();
218  // Create a association from simtracks to overall index in the mix collection
219  for (MixCollection<SimTrack>::MixItr iterator = mixCollection->begin(); iterator != mixCollection->end(); ++iterator, ++index)
220  {
221  EncodedTruthId objectId = EncodedTruthId(iterator->eventId(), iterator->trackId());
222  association.insert( std::make_pair(objectId, index) );
223  }
224 }
225 
226 
228  std::auto_ptr<MixCollection<SimVertex> > const & mixCollection,
229  EncodedTruthIdToIndex & association
230 )
231 {
232  int index = 0;
233 
234  // Solution to the problem of not having vertexId
235  bool useVertexId = true;
236  EncodedEventIdToIndex vertexId;
237  EncodedEventId oldEventId;
238  unsigned int oldVertexId = 0;
239 
240  // Loop for finding repeated vertexId (vertexId problem hack)
241  for (MixCollection<SimVertex>::MixItr iterator = mixCollection->begin(); iterator != mixCollection->end(); ++iterator, ++index)
242  {
243  if (!index || iterator->eventId() != oldEventId)
244  {
245  oldEventId = iterator->eventId();
246  oldVertexId = iterator->vertexId();
247  continue;
248  }
249 
250  if ( iterator->vertexId() == oldVertexId )
251  {
252  edm::LogWarning(MessageCategory_) << "Multiple vertexId found, no using vertexId.";
253  useVertexId = false;
254  break;
255  }
256  }
257 
258  // Reset the index
259  index = 0;
260 
261  // Clear the association map
262  association.clear();
263 
264  // Create a association from simvertexes to overall index in the mix collection
265  for (MixCollection<SimVertex>::MixItr iterator = mixCollection->begin(); iterator != mixCollection->end(); ++iterator, ++index)
266  {
267  EncodedTruthId objectId;
268  if (useVertexId)
269  objectId = EncodedTruthId(iterator->eventId(), iterator->vertexId());
270  else
271  objectId = EncodedTruthId(iterator->eventId(), vertexId[iterator->eventId()]++);
272  association.insert( std::make_pair(objectId, index) );
273  }
274 }
275 
276 
278 {
279  unsigned int index = 0;
280 
281  std::set<unsigned int> excludedTV, excludedTP;
282 
283  // Merge Bremsstrahlung vertexes
284  for (TrackingVertexCollection::iterator iVC = trackingVertexes_->begin(); iVC != trackingVertexes_->end(); ++iVC, ++index)
285  {
286  // Check Bremsstrahlung vertex
288  {
289  // Get a pointer to the source track (A Ref<> cannot be use with a product!)
290  TrackingParticle * track = &trackingParticles_->at(iVC->sourceTracks_begin()->key());
291  // Get a Ref<> to the source track
292  TrackingParticleRef trackRef = *iVC->sourceTracks_begin();
293  // Pointer to electron daughter
294  TrackingParticle * daughter = 0;
295  // Ref<> to electron daughter
296  TrackingParticleRef daughterRef;
297 
298  // Select the electron daughter and redirect the photon
299  for (TrackingVertex::tp_iterator idaughter = iVC->daughterTracks_begin(); idaughter != iVC->daughterTracks_end(); ++idaughter)
300  {
301  TrackingParticle * pointer = &trackingParticles_->at(idaughter->key());
302  if ( std::abs( pointer->pdgId() ) == 11 )
303  {
304  // Set pointer to the electron daughter
305  daughter = pointer;
306  // Set Ref<> to the electron daughter
307  daughterRef = *idaughter;
308  }
309  else if ( pointer->pdgId() == 22 )
310  {
311  // Delete the photon original parent vertex
312  pointer->clearParentVertex();
313  // Set the new parent vertex to the vertex of the source track
314  pointer->setParentVertex( track->parentVertex() );
315  // Get a non-const pointer to the parent vertex
316  TrackingVertex * vertex = &trackingVertexes_->at( track->parentVertex().key() );
317  // Add the photon to the doughter list of the parent vertex
318  vertex->addDaughterTrack( *idaughter );
319  }
320  }
321 
322  // Add the electron segments from the electron daughter
323  // track must not be the same particle as daughter
324  // if (track != daughter)
325  for (TrackingParticle::g4t_iterator isegment = daughter->g4Track_begin(); isegment != daughter->g4Track_end(); ++isegment)
326  track->addG4Track(*isegment);
327 
328  // Copy all the simhits to the new track
329  for (std::vector<PSimHit>::const_iterator ihit = daughter->pSimHit_begin(); ihit != daughter->pSimHit_end(); ++ihit)
330  track->addPSimHit(*ihit);
331 
332  // Make a copy of the decay vertexes of the track
333  TrackingVertexRefVector decayVertices( track->decayVertices() );
334 
335  // Clear the decay vertex list
336  track->clearDecayVertices();
337 
338  // Add the remaining vertexes
339  for (TrackingVertexRefVector::const_iterator idecay = decayVertices.begin(); idecay != decayVertices.end(); ++idecay)
340  if ( (*idecay).key() != index ) track->addDecayVertex(*idecay);
341 
342  // Redirect all the decay source vertexes to those in the electron daughter
343  for (TrackingParticle::tv_iterator idecay = daughter->decayVertices_begin(); idecay != daughter->decayVertices_end(); ++idecay)
344  {
345  // Add the vertexes to the decay list of the source particles
346  track->addDecayVertex(*idecay);
347  // Get a reference to decay vertex
348  TrackingVertex * vertex = &trackingVertexes_->at( idecay->key() );
349  // Copy all the source tracks from of the decay vertex
350  TrackingParticleRefVector sources( vertex->sourceTracks() );
351  // Clear the source track references
352  vertex->clearParentTracks();
353  // Add the new source tracks by excluding the one with the segment merged
354  for (TrackingVertex::tp_iterator isource = sources.begin(); isource != sources.end(); ++isource)
355  if (*isource != daughterRef)
356  vertex->addParentTrack(*isource);
357  // Add the track reference to the list of sources
358  vertex->addParentTrack(trackRef);
359  }
360 
361  // Adding the vertex to the exlusion list
362  excludedTV.insert(index);
363 
364  // Adding the electron segment tp into the exlusion list
365  excludedTP.insert( daughterRef.key() );
366  }
367  }
368 
369  edm::LogInfo(MessageCategory_) << "Generating the merged collection." << std::endl;
370 
371  // Reserved the same amount of memory for the merged collections
373  mergedTrackingVertexes_->reserve(trackingVertexes_->size());
374 
375  index = 0;
376  std::map<unsigned int, unsigned int> vertexMap;
377 
378  // Copy non-excluded vertices discarding parent & child tracks
379  for (TrackingVertexCollection::const_iterator iVC = trackingVertexes_->begin(); iVC != trackingVertexes_->end(); ++iVC, ++index)
380  {
381  if ( excludedTV.find(index) != excludedTV.end() ) continue;
382  // Save the new location of the non excluded vertexes (take in consideration those were removed)
383  vertexMap.insert( std::make_pair(index, mergedTrackingVertexes_->size()) );
384  // Copy those vertexes are not excluded
385  TrackingVertex newVertex = (*iVC);
386  newVertex.clearDaughterTracks();
387  newVertex.clearParentTracks();
388  mergedTrackingVertexes_->push_back(newVertex);
389  }
390 
391  index = 0;
392 
393  // Copy and cross reference the non-excluded tp to the merged collection
394  for (TrackingParticleCollection::const_iterator iTP = trackingParticles_->begin(); iTP != trackingParticles_->end(); ++iTP, ++index)
395  {
396  if ( excludedTP.find(index) != excludedTP.end() ) continue;
397 
398  TrackingVertexRef sourceV = iTP->parentVertex();
399  TrackingVertexRefVector decayVs = iTP->decayVertices();
400  TrackingParticle newTrack = *iTP;
401 
402  newTrack.clearParentVertex();
403  newTrack.clearDecayVertices();
404 
405  // Set vertex indices for new vertex product and track references in those vertices
406 
407  // Index of parent vertex in vertex container
408  unsigned int parentIndex = vertexMap[sourceV.key()];
409  // Index of this track in track container
410  unsigned int tIndex = mergedTrackingParticles_->size();
411 
412  // Add vertex to track
414  // Add track to vertex
415  (mergedTrackingVertexes_->at(parentIndex)).addDaughterTrack(TrackingParticleRef(refMergedTrackingParticles_, tIndex));
416 
417  for (TrackingVertexRefVector::const_iterator iDecayV = decayVs.begin(); iDecayV != decayVs.end(); ++iDecayV)
418  {
419  // Index of decay vertex in vertex container
420  unsigned int daughterIndex = vertexMap[iDecayV->key()];
421  // Add vertex to track
422  newTrack.addDecayVertex( TrackingVertexRef(refMergedTrackingVertexes_, daughterIndex) );
423  // Add track to vertex
424  (mergedTrackingVertexes_->at(daughterIndex)).addParentTrack( TrackingParticleRef(refMergedTrackingParticles_, tIndex) );
425  }
426 
427  mergedTrackingParticles_->push_back(newTrack);
428  }
429 }
430 
431 
433  TrackingVertex const & vertex,
434  std::auto_ptr<TrackingParticleCollection> & tPC
435 )
436 {
438 
439  // Check for the basic parent conditions
440  if ( parents.size() != 1)
441  return false;
442 
443  // Check for the parent particle is a |electron| (electron or positron)
444  if ( std::abs( tPC->at(parents.begin()->key()).pdgId() ) != 11 )
445  return false;
446 
447  int nElectrons = 0;
448  int nPhotons = 0;
449  int nOthers = 0;
450 
451  // Loop over the daughter particles and counts the number of |electrons|, photons or others
452  for ( TrackingVertex::tp_iterator it = vertex.daughterTracks_begin(); it != vertex.daughterTracks_end(); ++it )
453  {
454  // Stronger rejection for looping particles
455  if ( parents[0] == *it )
456  return false;
457 
458  if ( std::abs( tPC->at(it->key()).pdgId() ) == 11 )
459  nElectrons++;
460  else if ( tPC->at(it->key()).pdgId() == 22 )
461  nPhotons++;
462  else
463  nOthers++;
464  }
465 
466  // Condition to be a Bremsstrahlung Vertex
467  if (nElectrons == 1 && nPhotons >= 0 && nOthers == 0)
468  return true;
469 
470  return false;
471 }
472 
473 
475 {
476  // Reset the event counter (use for define vertexId)
477  eventIdCounter_.clear();
478 
479  // Define a container of vetoed traks
480  std::map<int,std::size_t> vetoedTracks;
481 
482  // Define map between parent simtrack and tv indexes
483  std::map<int,std::size_t> vetoedSimVertexes;
484 
485  for (int simTrackIndex = 0; simTrackIndex != simTracks_->size(); ++simTrackIndex)
486  {
487  // Check if the simTrack is excluded (includes non traceable and recovered by history)
488  if ( vetoedTracks.find(simTrackIndex) != vetoedTracks.end() ) continue;
489 
490  SimTrack const & simTrack = simTracks_->getObject(simTrackIndex);
491 
492  TrackingParticle trackingParticle;
493 
494  // Set a bare tp (only with the psimhit) with a given simtrack
495  // the function return true if it is tracable
496  if ( setTrackingParticle(simTrack, trackingParticle) )
497  {
498  // Follows the path upward recovering the history of the particle
499  SimTrack const * currentSimTrack = & simTrack;
500 
501  // Initial condition for the tp and tv indexes
502  int trackingParticleIndex = -1;
503  int trackingVertexIndex = -1;
504 
505  do
506  {
507  // Set a new tracking particle for the current simtrack
508  // and add it to the list of parent tracks of previous vertex
509  if (trackingParticleIndex >= 0)
510  {
511  setTrackingParticle(*currentSimTrack, trackingParticle);
512 
513  // Set the tp index to its new value
514  trackingParticleIndex = trackingParticles_->size();
515  // Push the tp in to the collection
516  trackingParticles_->push_back(trackingParticle);
517 
518  // Add the previous track to the list of decay vertexes of the new tp
519  trackingParticles_->at(trackingParticleIndex).addDecayVertex(
520  TrackingVertexRef(refTrackingVertexes_, trackingVertexIndex)
521  );
522 
523  // Add the new tp to the list of parent tracks of the previous tv
524  trackingVertexes_->at(trackingVertexIndex).addParentTrack(
525  TrackingParticleRef(refTrackingParticles_, trackingParticleIndex)
526  );
527  }
528  else
529  {
530  // Set the tp index to its new value
531  trackingParticleIndex = trackingParticles_->size();
532  // Push the tp in to the collection
533  trackingParticles_->push_back(trackingParticle);
534  // Vetoed the simTrack
535  vetoedTracks.insert( std::make_pair(simTrackIndex, trackingParticleIndex) );
536  }
537 
538  // Verify if the parent simVertex has a simTrack or if the source is a vetoSimVertex
539  if (currentSimTrack->noVertex()) break;
540 
541  // Get the simTrack parent index (it is implicit should be in the same event as current)
542  unsigned int parentSimVertexIndex = vertexIdToIndex_[
544  currentSimTrack->eventId(),
545  currentSimTrack->vertIndex()
546  )
547  ];
548  // Create a new tv
549  TrackingVertex trackingVertex;
550  // Get the parent simVertex associated to the current simTrack
551  SimVertex const * parentSimVertex = & simVertexes_->getObject(parentSimVertexIndex);
552 
553  bool vetoSimVertex = vetoedSimVertexes.find(parentSimVertexIndex) != vetoedSimVertexes.end();
554 
555  // Check for a already visited parent simTrack
556  if ( !vetoSimVertex )
557  {
558  // Set the tv by using simvertex
559  trackingVertexIndex = setTrackingVertex(*parentSimVertex, trackingVertex);
560 
561  // Check if a new vertex needs to be created
562  if (trackingVertexIndex < 0)
563  {
564  // Set the tv index ot its new value
565  trackingVertexIndex = trackingVertexes_->size();
566  // Push the new tv in to the collection
567  trackingVertexes_->push_back(trackingVertex);
568  }
569  else
570  {
571  // Get the postion and time of the vertex
572  const LorentzVector & position = trackingVertexes_->at(trackingVertexIndex).position();
573  Vector xyz = Vector(position.x(), position.y(), position.z());
574  double t = position.t();
575  // Set the vertex postion of the tp to the closest vertex
576  trackingParticles_->at(trackingParticleIndex).setVertex(xyz, t);
577  }
578 
579  vetoedSimVertexes.insert( std::make_pair(parentSimVertexIndex, trackingVertexIndex) );
580  }
581  else
582  trackingVertexIndex = vetoedSimVertexes[parentSimVertexIndex];
583 
584  // Set the newly created tv as parent vertex
585  trackingParticles_->at(trackingParticleIndex).setParentVertex(
586  TrackingVertexRef(refTrackingVertexes_, trackingVertexIndex)
587  );
588 
589  // Add the newly created tp to the tv daughter list
590  trackingVertexes_->at(trackingVertexIndex).addDaughterTrack(
591  TrackingParticleRef(refTrackingParticles_, trackingParticleIndex)
592  );
593 
594  // Verify if the parent simVertex has a simTrack or if the source is a vetoSimVertex
595  if (parentSimVertex->noParent() || vetoSimVertex) break;
596 
597  // Get the next simTrack index (it is implicit should be in the same event as current).
598  unsigned int nextSimTrackIndex = trackIdToIndex_[
600  currentSimTrack->eventId(),
601  parentSimVertex->parentIndex()
602  )
603  ];
604 
605  // Check if the next track exist
606  if ( vetoedTracks.find(nextSimTrackIndex) != vetoedTracks.end() )
607  {
608  // Add to the newly created tv the existent next simtrack in to parent list.
609  trackingVertexes_->at(trackingVertexIndex).addParentTrack(
610  TrackingParticleRef(refTrackingParticles_, vetoedTracks[nextSimTrackIndex])
611  );
612  // Add the vertex to list of decay vertexes of the new tp
613  trackingParticles_->at(vetoedTracks[nextSimTrackIndex]).addDecayVertex(
614  TrackingVertexRef(refTrackingVertexes_, trackingVertexIndex)
615  );
616  break;
617  }
618 
619  // Vetoed the next simTrack
620  vetoedTracks.insert( std::make_pair(nextSimTrackIndex, trackingParticleIndex) );
621 
622  // Set the current simTrack as the next simTrack
623  currentSimTrack = & simTracks_->getObject(nextSimTrackIndex);
624  }
625  while (!currentSimTrack->noVertex());
626  }
627  }
628 }
629 
630 
632  SimTrack const & simTrack,
633  TrackingParticle & trackingParticle
634 )
635 {
636  // Get the eventid associated to the track
637  EncodedEventId trackEventId = simTrack.eventId();
638  // Get the simtrack id
639  EncodedTruthId simTrackId = EncodedTruthId( trackEventId, simTrack.trackId() );
640 
641  // Location of the parent vertex
643  // If not parent then location is (0,0,0,0)
644  if (simTrack.noVertex())
645  position = LorentzVector(0, 0, 0, 0);
646  else
647  position = simVertexes_->getObject(simTrack.vertIndex()). position();
648 
649  // Define the default status and pdgid
650  int status = -99;
651  int pdgId = simTrack.type();
652 
653  int genParticleIndex = simTrack.genpartIndex();
654  bool signalEvent = (trackEventId.event() == 0 && trackEventId.bunchCrossing() == 0);
655 
656  // In the case of a existing generated particle and track
657  // event is signal redefine status a pdgId
658 
660 
661  if (genParticleIndex >= 0 && (signalEvent || useMultipleHepMCLabels_) )
662  {
663  // Get the generated particle
664  hepmc = (useMultipleHepMCLabels_) ? hepMCProducts_.at(trackEventId.rawId()) : hepmc = hepMCProducts_.at(0);
665 
666  const HepMC::GenParticle * genParticle = hepmc->GetEvent()->barcode_to_particle(genParticleIndex);
667 
668  if (genParticle)
669  {
670  status = genParticle->status();
671  pdgId = genParticle->pdg_id();
672  }
673  }
674 
675  // Create a tp from the simtrack
676  trackingParticle = TrackingParticle(
677  (char) simTrack.charge(),
678  simTrack.momentum(),
679  Vector(position.x(), position.y(), position.z()),
680  position.t(),
681  pdgId,
682  status,
683  trackEventId
684  );
685 
686  bool init = true;
687 
688  int processType = 0;
689  int particleType = 0;
690 
691  // Counting the TP hits using the layers (as in ORCA).
692  // Does seem to find less hits. maybe b/c layer is a number now, not a pointer
693  int totalSimHits = 0;
694  int oldLayer = 0;
695  int newLayer = 0;
696  int oldDetector = 0;
697  int newDetector = 0;
698 
699  // Loop over the associated hits per track
700  for (
701  EncodedTruthIdToIndexes::const_iterator iEntry = trackIdToHits_.lower_bound(simTrackId);
702  iEntry != trackIdToHits_.upper_bound(simTrackId);
703  ++iEntry
704  )
705  {
706  // Get a constant reference to the simhit
707  PSimHit const & pSimHit = pSimHits_.at(iEntry->second);
708 
709  // Initial condition for consistent simhit selection
710  if (init)
711  {
712  processType = pSimHit.processType();
713  particleType = pSimHit.particleType();
714  init = false;
715  }
716 
717  // Check for delta and interaction products discards
718  if (processType == pSimHit.processType() && particleType == pSimHit.particleType() && pdgId == pSimHit.particleType() )
719  {
720  trackingParticle.addPSimHit(pSimHit);
721 
722  unsigned int detectorIdIndex = pSimHit.detUnitId();
723  DetId detectorId = DetId(detectorIdIndex);
724  oldLayer = newLayer;
725  oldDetector = newDetector;
726  newLayer = LayerFromDetid(detectorIdIndex);
727  newDetector = detectorId.subdetId();
728 
729  // Count hits using layers for glued detectors
730  // newlayer !=0 excludes Muon layers set to 0 by LayerFromDetid
731  if ( ( oldLayer != newLayer || (oldLayer==newLayer && oldDetector!=newDetector ) ) && newLayer != 0 ) totalSimHits++;
732  }
733  }
734 
735  // Set the number of matched simhits
736  trackingParticle.setMatchedHit(totalSimHits);
737 
738  // Add the simtrack associated to the tp
739  trackingParticle.addG4Track(simTrack);
740 
741  // Add the generator information
742  if ( genParticleIndex >= 0 && (signalEvent || useMultipleHepMCLabels_) )
743  trackingParticle.addGenParticle( GenParticleRef(hepmc, genParticleIndex) );
744 
745  if (selectorFlag_) return selector_(trackingParticle);
746 
747  return true;
748 }
749 
750 
752  SimVertex const & simVertex,
753  TrackingVertex & trackingVertex
754 )
755 {
756  LorentzVector const & position = simVertex.position();
757 
758  // Look for close by vertexes
759  for (std::size_t trackingVertexIndex = 0; trackingVertexIndex < trackingVertexes_->size(); ++trackingVertexIndex)
760  {
761  // Calculate the distance
762  double distance = (position - trackingVertexes_->at(trackingVertexIndex).position()).P();
763  // If the distance is under a given cut return the trackingVertex index (vertex merging)
764  if (distance <= distanceCut_)
765  {
766  // Add simvertex to the pre existent tv
767  trackingVertexes_->at(trackingVertexIndex).addG4Vertex(simVertex);
768  // return tv index
769  return trackingVertexIndex;
770  }
771  }
772 
773  // Get the event if from the simvertex
774  EncodedEventId simVertexEventId = simVertex.eventId();
775 
776  // Initialize the event counter
777  if (eventIdCounter_.find(simVertexEventId) == eventIdCounter_.end())
778  eventIdCounter_[simVertexEventId] = 0;
779 
780  // Get the simVertex id
781  EncodedTruthId simVertexId = EncodedTruthId(simVertexEventId, eventIdCounter_[simVertexEventId]);
782 
783  // Calculate if the vertex is in the tracker volume (it needs to be review for other detectors)
784  bool inVolume = (position.Pt() < volumeRadius_ && std::abs(position.z()) < volumeZ_); // In or out of Tracker
785 
786  // Initialize the new vertex
787  trackingVertex = TrackingVertex(position, inVolume, simVertexId);
788 
789  // Find the the closest GenVertexes to the created tv
790  addCloseGenVertexes(trackingVertex);
791 
792  // Add the g4 vertex to the tv
793  trackingVertex.addG4Vertex(simVertex);
794 
795  // Initialize the event counter
796  eventIdCounter_[simVertexEventId]++;
797 
798  return -1;
799 }
800 
801 
803 {
804  // Get the generated particle
806  const HepMC::GenEvent * genEvent = hepmc->GetEvent();
807 
808  // Get the postion of the tv
809  Vector tvPosition(trackingVertex.position().x(), trackingVertex.position().y(), trackingVertex.position().z());
810 
811  // Find HepMC vertices, put them in a close TrackingVertex (this could conceivably add the same GenVertex to multiple TrackingVertices)
812  for (
813  HepMC::GenEvent::vertex_const_iterator iGenVertex = genEvent->vertices_begin();
814  iGenVertex != genEvent->vertices_end();
815  ++iGenVertex
816  )
817  {
818  // Get the position of the genVertex
819  HepMC::ThreeVector rawPosition = (*iGenVertex)->position();
820 
821  // Convert to cm
822  Vector genPosition(rawPosition.x()/10.0, rawPosition.y()/10.0, rawPosition.z()/10.0);
823 
824  // Calculate the dis
825  double distance = sqrt( (tvPosition - genPosition).mag2() );
826 
827  if (distance <= distanceCut_)
828  trackingVertex.addGenVertex( GenVertexRef(hepmc, (*iGenVertex)->barcode()) );
829  }
830 }
831 
832 
834 {
835  DetId detId = DetId(detid);
836 
837  if ( detId.det() != DetId::Tracker ) return 0;
838 
839  int layerNumber=0;
840  unsigned int subdetId = static_cast<unsigned int>(detId.subdetId());
841 
842  if ( subdetId == StripSubdetector::TIB)
843  {
844  TIBDetId tibid(detId.rawId());
845  layerNumber = tibid.layer();
846  }
847  else if ( subdetId == StripSubdetector::TOB )
848  {
849  TOBDetId tobid(detId.rawId());
850  layerNumber = tobid.layer();
851  }
852  else if ( subdetId == StripSubdetector::TID)
853  {
854  TIDDetId tidid(detId.rawId());
855  layerNumber = tidid.wheel();
856  }
857  else if ( subdetId == StripSubdetector::TEC )
858  {
859  TECDetId tecid(detId.rawId());
860  layerNumber = tecid.wheel();
861  }
862  else if ( subdetId == PixelSubdetector::PixelBarrel )
863  {
864  PXBDetId pxbid(detId.rawId());
865  layerNumber = pxbid.layer();
866  }
867  else if ( subdetId == PixelSubdetector::PixelEndcap )
868  {
869  PXFDetId pxfid(detId.rawId());
870  layerNumber = pxfid.disk();
871  }
872  else
873  edm::LogVerbatim("TrackingTruthProducer") << "Unknown subdetid: " << subdetId;
874 
875  return layerNumber;
876 }
877 
std::auto_ptr< TrackingVertexCollection > trackingVertexes_
T getParameter(std::string const &) const
tp_iterator daughterTracks_begin() const
int i
Definition: DBlmapReader.cc:9
const TrackingParticleRefVector & sourceTracks() const
tv_iterator decayVertices_end() const
EncodedEventId eventId() const
Definition: CoreSimTrack.h:46
std::auto_ptr< TrackingParticleCollection > trackingParticles_
int event() const
get the contents of the subdetector field (should be protected?)
TPRegexp parents
Definition: eve_filter.cc:24
tv_iterator decayVertices_begin() const
void produce(edm::Event &, const edm::EventSetup &)
unsigned int layer() const
layer id
Definition: TOBDetId.h:39
TrackingParticleRefProd refMergedTrackingParticles_
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:15
std::auto_ptr< MixCollection< SimTrack > > simTracks_
std::auto_ptr< TrackingVertexCollection > mergedTrackingVertexes_
MuonPSimHitSelector muonPSimHitSelector_
std::auto_ptr< TrackingParticleCollection > mergedTrackingParticles_
PixelPSimHitSelector pixelPSimHitSelector_
ROOT::Math::Plane3D::Vector Vector
Definition: EcalHitMaker.cc:28
EncodedEventIdToIndex eventIdCounter_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
g4t_iterator g4Track_begin() const
int pdgId() const
PDG id, signal source, crossing number.
int LayerFromDetid(const unsigned int &)
std::multimap< EncodedTruthId, unsigned int > EncodedTruthIdToIndexes
unsigned int layerNumber(align::ID)
Layer number increases with rho from 1 to 8.
Definition: TIBNameSpace.h:85
TrackingParticleRefProd refTrackingParticles_
int init
Definition: HydjetWrapper.h:63
math::XYZTLorentzVector LorentzVector
const std::vector< PSimHit >::const_iterator pSimHit_begin() const
bool exists(std::string const &parameterName) const
checks if a parameter exists
#define abs(x)
Definition: mlp_lapack.h:159
void addDaughterTrack(const TrackingParticleRef &)
const std::vector< PSimHit >::const_iterator pSimHit_end() const
EncodedTruthIdToIndexes trackIdToHits_
#define P
TrackerPSimHitSelector trackerPSimHitSelector_
TrackingParticleSelector selector_
void clearDaughterTracks()
edm::Ref< edm::HepMCProduct, HepMC::GenParticle > GenParticleRef
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:243
void addParentTrack(const TrackingParticleRef &)
float charge() const
charge
Definition: CoreSimTrack.cc:3
void setMatchedHit(const int &)
TrackingVertexRefProd refMergedTrackingVertexes_
bool isBremsstrahlungVertex(TrackingVertex const &vertex, std::auto_ptr< TrackingParticleCollection > &tPC)
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:238
unsigned int layer() const
layer id
Definition: PXBDetId.h:35
EncodedTruthIdToIndex trackIdToIndex_
void addG4Vertex(const SimVertex &)
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
SingleObjectSelector< TrackingParticleCollection,::TrackingParticleSelector > TrackingParticleSelector
TrackingVertexRefProd refTrackingVertexes_
int parentIndex() const
Definition: SimVertex.h:33
virtual void select(PSimHitCollection &, edm::Event const &, edm::EventSetup const &) const
Pre-process event information.
void associator(std::vector< PSimHit > const &, EncodedTruthIdToIndexes &)
void addPSimHit(const PSimHit &)
std::auto_ptr< MixCollection< SimVertex > > simVertexes_
T sqrt(T t)
Definition: SSEVec.h:28
int bunchCrossing() const
get the detector field from this detid
void addCloseGenVertexes(TrackingVertex &)
void addDecayVertex(const TrackingVertexRef &)
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
Definition: SimTrack.h:33
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
TrackingTruthProducer(const edm::ParameterSet &)
bool noVertex() const
Definition: SimTrack.h:30
tuple genEvent
Definition: MCTruth.py:33
const math::XYZTLorentzVectorD & position() const
Definition: CoreSimVertex.h:26
uint32_t rawId() const
get the raw id
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:39
tp_iterator daughterTracks_end() const
const TrackingVertexRef & parentVertex() const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:355
unsigned int disk() const
disk id
Definition: PXFDetId.h:43
PSimHitSelector::PSimHitCollection pSimHits_
std::vector< edm::Handle< edm::HepMCProduct > > hepMCProducts_
std::vector< SimTrack >::const_iterator g4t_iterator
int vertIndex() const
index of the vertex in the Event container (-1 if no vertex)
Definition: SimTrack.h:29
edm::Ref< TrackingVertexCollection > TrackingVertexRef
Definition: DetId.h:20
edm::Ref< edm::HepMCProduct, HepMC::GenVertex > GenVertexRef
unsigned int trackId() const
Definition: CoreSimTrack.h:49
PSimHitSelector pSimHitSelector_
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:13
void clearParentTracks()
std::vector< TrackingVertex > TrackingVertexCollection
key_type key() const
Accessor for product key.
Definition: Ref.h:265
std::vector< std::string > dataLabels_
int setTrackingVertex(SimVertex const &, TrackingVertex &)
T const * product() const
Definition: Handle.h:74
unsigned int wheel() const
wheel id
Definition: TECDetId.h:52
unsigned short processType() const
Definition: PSimHit.h:118
unsigned int layer() const
layer id
Definition: TIBDetId.h:41
void addGenVertex(const GenVertexRef &)
const EncodedEventId & eventId() const
int type() const
particle type (HEP PDT convension)
Definition: CoreSimTrack.h:40
int particleType() const
Definition: PSimHit.h:85
void addGenParticle(const GenParticleRef &)
EncodedEventId eventId() const
Definition: CoreSimVertex.h:30
const math::XYZTLorentzVectorD & momentum() const
particle info...
Definition: CoreSimTrack.h:36
virtual void select(PSimHitCollection &, edm::Event const &, edm::EventSetup const &) const
Pre-process event information.
void addG4Track(const SimTrack &)
virtual void select(PSimHitCollection &, edm::Event const &, edm::EventSetup const &) const
Select the psimhit add them to a PSimHitCollection.
bool noParent() const
Definition: SimVertex.h:34
std::vector< TrackingParticle > TrackingParticleCollection
tuple status
Definition: ntuplemaker.py:245
virtual void select(PSimHitCollection &, edm::Event const &, edm::EventSetup const &) const
Pre-process event information.
bool setTrackingParticle(SimTrack const &, TrackingParticle &)
Detector det() const
get the detector field from this detid
Definition: DetId.h:37
g4t_iterator g4Track_end() const
const TrackingVertexRefVector & decayVertices() const
void setParentVertex(const TrackingVertexRef &)
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
edm::Ref< TrackingParticleCollection > TrackingParticleRef
unsigned int detUnitId() const
Definition: PSimHit.h:93
math::PtEtaPhiELorentzVectorF LorentzVector
unsigned int wheel() const
wheel id
Definition: TIDDetId.h:50
std::map< EncodedEventId, unsigned int > EncodedEventIdToIndex
std::map< EncodedTruthId, unsigned int > EncodedTruthIdToIndex
EncodedTruthIdToIndex vertexIdToIndex_
const LorentzVector & position() const