75 struct DecayChainTrack
78 struct DecayChainVertex* pParentVertex;
80 std::vector<struct DecayChainVertex*> daughterVertices;
81 DecayChainTrack* pMergedBremSource;
82 DecayChainTrack() : simTrackIndex(-1), pParentVertex(
NULL), pMergedBremSource(
NULL) {}
83 DecayChainTrack(
int newSimTrackIndex ) : simTrackIndex(newSimTrackIndex), pParentVertex(
NULL), pMergedBremSource() {}
90 struct DecayChainVertex
93 DecayChainTrack* pParentTrack;
94 std::vector<DecayChainTrack*> daughterTracks;
95 DecayChainVertex* pMergedBremSource;
96 DecayChainVertex() : simVertexIndex(-1), pParentTrack(
NULL), pMergedBremSource(
NULL) {}
97 DecayChainVertex(
int newIndex ) : simVertexIndex(newIndex), pParentTrack(
NULL), pMergedBremSource(
NULL) {}
113 DecayChain(
const std::vector<SimTrack>& trackCollection,
const std::vector<SimVertex>&
vertexCollection );
114 const size_t decayTracksSize;
115 const size_t decayVerticesSize;
121 void integrityCheck();
122 const SimTrack& getSimTrack( const ::DecayChainTrack* pDecayTrack )
const {
return simTrackCollection_.at( pDecayTrack->simTrackIndex ); }
123 const SimVertex& getSimVertex( const ::DecayChainVertex* pDecayVertex )
const {
return simVertexCollection_.at( pDecayVertex->simVertexIndex ); }
125 void findBrem(
const std::vector<SimTrack>& trackCollection,
const std::vector<SimVertex>&
vertexCollection );
126 std::unique_ptr< ::DecayChainTrack[]> decayTracks_;
127 std::unique_ptr< ::DecayChainVertex[]> decayVertices_;
130 std::vector< ::DecayChainVertex*> rootVertices_;
133 const std::vector<SimTrack>& simTrackCollection_;
134 const std::vector<SimVertex>& simVertexCollection_;
136 const std::unique_ptr< ::DecayChainTrack[]>& decayTracks;
137 const std::unique_ptr< ::DecayChainVertex[]>& decayVertices;
138 const std::vector< ::DecayChainVertex*>& rootVertices;
145 class TrackingParticleFactory
148 TrackingParticleFactory( const ::DecayChain& decayChain,
const edm::Handle< std::vector<reco::GenParticle> >& hGenParticles,
150 const std::vector<const PSimHit*>&
simHits,
double volumeRadius,
double volumeZ,
double vertexDistanceCut,
bool allowDifferentProcessTypes );
151 TrackingParticle createTrackingParticle(
const DecayChainTrack* pTrack )
const;
152 TrackingVertex createTrackingVertex(
const DecayChainVertex* pVertex)
const;
155 const ::DecayChain& decayChain_;
158 std::vector<int> genParticleIndices_;
159 const std::vector<const PSimHit*>& simHits_;
160 const double volumeRadius_;
161 const double volumeZ_;
162 const double vertexDistanceCut2_;
163 std::multimap<unsigned int, size_t> trackIdToHitIndex_;
164 bool allowDifferentProcessTypeForDifferentDetectors_;
171 class OutputCollectionWrapper
177 TrackingParticle* getTrackingParticle( const ::DecayChainTrack* pDecayTrack );
179 void setProxy( const ::DecayChainTrack* pOriginalTrack, const ::DecayChainTrack* pProxyTrack );
180 void setProxy( const ::DecayChainVertex* pOriginalVertex, const ::DecayChainVertex* pProxyVertex );
181 TrackingVertex* getTrackingVertex( const ::DecayChainVertex* pDecayVertex );
185 void associateToExistingObjects( const ::DecayChainVertex* pChainVertex );
186 void associateToExistingObjects( const ::DecayChainTrack* pChainTrack );
188 std::vector<int> trackingParticleIndices_;
189 std::vector<int> trackingVertexIndices_;
206 void addTrack( ::DecayChainTrack* pDecayChainTrack,
const TrackingParticleSelector* pSelector, ::OutputCollectionWrapper* pUnmergedOutput, ::OutputCollectionWrapper* pMergedOutput, const ::TrackingParticleFactory& objectFactory,
bool addAncestors);
225 messageCategory_(
"TrackingTruthAccumulator"),
226 volumeRadius_( config.getParameter<double>(
"volumeRadius") ),
227 volumeZ_( config.getParameter<double>(
"volumeZ") ),
228 vertexDistanceCut_( config.getParameter<double>(
"vertexDistanceCut") ),
229 ignoreTracksOutsideVolume_( config.getParameter<bool>(
"ignoreTracksOutsideVolume") ),
230 maximumPreviousBunchCrossing_( config.getParameter<unsigned int>(
"maximumPreviousBunchCrossing") ),
231 maximumSubsequentBunchCrossing_( config.getParameter<unsigned int>(
"maximumSubsequentBunchCrossing") ),
232 createUnmergedCollection_( config.getParameter<bool>(
"createUnmergedCollection") ),
233 createMergedCollection_(config.getParameter<bool>(
"createMergedBremsstrahlung") ),
234 addAncestors_( config.getParameter<bool>(
"alwaysAddAncestors") ),
235 removeDeadModules_( config.getParameter<bool>(
"removeDeadModules") ),
236 simTrackLabel_( config.getParameter<edm::InputTag>(
"simTrackCollection") ),
237 simVertexLabel_( config.getParameter<edm::InputTag>(
"simVertexCollection") ),
239 genParticleLabel_( config.getParameter<edm::InputTag>(
"genParticleCollection") ),
240 hepMCproductLabel_( config.getParameter<edm::InputTag>(
"HepMCProductLabel") ),
241 allowDifferentProcessTypeForDifferentDetectors_( config.getParameter<bool>(
"allowDifferentSimHitProcesses") )
249 <<
"set to false, which means no collections will be created";
253 if( config.
exists(
"select" ) )
305 std::vector<std::string> parameterNames=simHitCollectionConfig.
getParameterNames();
307 for(
const auto& parameterName : parameterNames )
309 std::vector<edm::InputTag>
tags=simHitCollectionConfig.getParameter<std::vector<edm::InputTag> >(parameterName);
314 iC.
consumes<std::vector<PSimHit> >(collectionTag);
373 <<
" TrackingVertexs to the event.";
382 <<
" merged TrackingVertexs to the event.";
424 DecayChain decayChain( *hSimTracks, *hSimVertices );
427 std::auto_ptr< ::OutputCollectionWrapper> pUnmergedCollectionWrapper;
428 std::auto_ptr< ::OutputCollectionWrapper> pMergedCollectionWrapper;
432 std::vector<const PSimHit*> simHitPointers;
450 ::DecayChainTrack* pDecayTrack=&decayChain.decayTracks[
index];
451 const SimTrack& simTrack=hSimTracks->at(pDecayTrack->simTrackIndex);
464 const SimVertex& simVertex=hSimVertices->at( pDecayTrack->pParentVertex->simVertexIndex );
465 if( !objectFactory.vectorIsInsideVolume( simVertex.
position() ) )
continue;
472 ::addTrack( pDecayTrack, pSelector, pUnmergedCollectionWrapper.get(), pMergedCollectionWrapper.get(), objectFactory,
addAncestors_ );
482 event.getByLabel( collectionTag, hSimHits );
485 for(
const auto& simHit : *hSimHits )
487 returnValue.push_back( &simHit );
516 ::TrackingParticleFactory::TrackingParticleFactory( const ::DecayChain& decayChain,
const edm::Handle< std::vector<reco::GenParticle> >& hGenParticles,
518 double volumeRadius,
double volumeZ,
double vertexDistanceCut,
bool allowDifferentProcessTypes )
519 : decayChain_(decayChain), hGenParticles_(hGenParticles), hepMCproduct_(hepMCproduct), simHits_(simHits), volumeRadius_(volumeRadius),
520 volumeZ_(volumeZ), vertexDistanceCut2_(vertexDistanceCut*vertexDistanceCut), allowDifferentProcessTypeForDifferentDetectors_(allowDifferentProcessTypes)
526 trackIdToHitIndex_.insert( std::make_pair( simHits_[
index]->trackId(),
index ) );
529 if( hHepMCGenParticleIndices.isValid() )
531 genParticleIndices_.resize( hHepMCGenParticleIndices->size()+1 );
535 for(
size_t recoGenParticleIndex=0; recoGenParticleIndex<hHepMCGenParticleIndices->size(); ++recoGenParticleIndex )
537 size_t hepMCGenParticleIndex=(*hHepMCGenParticleIndices)[recoGenParticleIndex];
540 if( genParticleIndices_.size()<=hepMCGenParticleIndex ) genParticleIndices_.resize(hepMCGenParticleIndex+1);
542 genParticleIndices_[ hepMCGenParticleIndex ]=recoGenParticleIndex;
547 TrackingParticle TrackingParticleFactory::createTrackingParticle( const ::DecayChainTrack* pChainTrack )
const
552 const SimTrack& simTrack=decayChain_.getSimTrack( pChainTrack );
553 const SimVertex& parentSimVertex=decayChain_.getSimVertex( pChainTrack->pParentVertex );
555 LorentzVector
position( 0, 0, 0, 0 );
572 if( hepMCGenParticleIndex>=0 && hepMCGenParticleIndex<static_cast<int>(genParticleIndices_.size()) && hGenParticles_.isValid() )
574 int recoGenParticleIndex=genParticleIndices_[hepMCGenParticleIndex];
576 pdgId=generatorParticleRef->pdgId();
586 size_t matchedHits=0;
587 size_t numberOfHits=0;
588 size_t numberOfTrackerHits=0;
598 for( std::multimap<unsigned int,size_t>::const_iterator iHitIndex=trackIdToHitIndex_.lower_bound( simTrack.
trackId() );
599 iHitIndex!=trackIdToHitIndex_.upper_bound( simTrack.
trackId() );
602 const auto& pSimHit=simHits_[ iHitIndex->second ];
607 processType=pSimHit->processType();
608 particleType=pSimHit->particleType();
609 newDetector=
DetId( pSimHit->detUnitId() );
613 oldDetector=newDetector;
614 newDetector=
DetId( pSimHit->detUnitId() );
618 if( allowDifferentProcessTypeForDifferentDetectors_ && newDetector.
det()!=oldDetector.
det() ) processType=pSimHit->processType();
621 if( processType==pSimHit->processType() && particleType==pSimHit->particleType() && pdgId==pSimHit->particleType() )
627 newLayer=LayerFromDetid( newDetector );
631 if( (oldLayer!=newLayer || (oldLayer==newLayer && oldDetector.
subdetId()!=newDetector.
subdetId())) && newLayer!=0 ) ++matchedHits;
642 TrackingVertex TrackingParticleFactory::createTrackingVertex( const ::DecayChainVertex* pChainVertex)
const
649 const SimVertex& simVertex=decayChain_.getSimVertex( pChainVertex );
651 bool isInVolume=this->vectorIsInsideVolume( simVertex.
position() );
658 returnValue.addG4Vertex(simVertex);
663 const HepMC::GenEvent*
genEvent = hepMCproduct_->GetEvent();
665 if (genEvent !=
NULL)
667 Vector tvPosition(returnValue.position().x(), returnValue.position().
y(), returnValue.position().z());
669 for (HepMC::GenEvent::vertex_const_iterator iGenVertex = genEvent->vertices_begin(); iGenVertex != genEvent->vertices_end(); ++iGenVertex)
671 HepMC::ThreeVector rawPosition = (*iGenVertex)->position();
673 Vector genPosition(rawPosition.x()*0.1, rawPosition.y()*0.1, rawPosition.z()*0.1);
675 auto distance2 = (tvPosition - genPosition).
mag2();
677 if (distance2 < vertexDistanceCut2_)
678 returnValue.addGenVertex(
GenVertexRef(hepMCproduct_, (*iGenVertex)->barcode()) );
688 return ( vector.Pt()<volumeRadius_ && vector.z()<volumeZ_ );
697 ::DecayChain::DecayChain(
const std::vector<SimTrack>& trackCollection,
const std::vector<SimVertex>&
vertexCollection )
698 : decayTracksSize( trackCollection.
size() ),
699 decayVerticesSize( vertexCollection.
size() ),
700 decayTracks_( new DecayChainTrack[decayTracksSize] ),
701 decayVertices_( new DecayChainVertex[decayVerticesSize] ),
702 simTrackCollection_( trackCollection ),
703 simVertexCollection_( vertexCollection ),
704 decayTracks( decayTracks_ ),
705 decayVertices( decayVertices_ ),
706 rootVertices( rootVertices_ )
709 std::map<int,::DecayChainTrack*> trackIdToDecayTrack;
710 std::map<int,::DecayChainVertex*> vertexIdToDecayVertex;
716 size_t decayVertexIndex=0;
719 ::DecayChainTrack* pDecayTrack=&decayTracks_[
index];
724 pDecayTrack->simTrackIndex=
index;
726 trackIdToDecayTrack[ trackCollection[
index].trackId() ]=pDecayTrack;
728 int parentVertexIndex=trackCollection[
index].vertIndex();
729 if( parentVertexIndex>=0 )
732 ::DecayChainVertex*& pParentVertex=vertexIdToDecayVertex[parentVertexIndex];
733 if( pParentVertex==
NULL )
736 pParentVertex=&decayVertices_[decayVertexIndex];
738 pParentVertex->simVertexIndex=parentVertexIndex;
740 pParentVertex->daughterTracks.push_back(pDecayTrack);
741 pDecayTrack->pParentVertex=pParentVertex;
743 else throw std::runtime_error(
"TrackingTruthAccumulator: Found a track with an invalid parent vertex index." );
755 for(
auto& decayVertexMapPair : vertexIdToDecayVertex )
757 ::DecayChainVertex* pDecayVertex=decayVertexMapPair.second;
758 int parentTrackIndex=vertexCollection[pDecayVertex->simVertexIndex].parentIndex();
759 if( parentTrackIndex!=-1 )
761 std::map<int,::DecayChainTrack*>::iterator iParentTrackMapPair=trackIdToDecayTrack.find(parentTrackIndex);
762 if( iParentTrackMapPair==trackIdToDecayTrack.end() )
764 std::stringstream errorStream;
765 errorStream <<
"TrackingTruthAccumulator: Something has gone wrong with the indexing. Parent track index is " << parentTrackIndex <<
".";
766 throw std::runtime_error( errorStream.str() );
769 ::DecayChainTrack* pParentTrackHierarchy=iParentTrackMapPair->second;
771 pParentTrackHierarchy->daughterVertices.push_back( pDecayVertex );
772 pDecayVertex->pParentTrack=pParentTrackHierarchy;
774 else rootVertices_.push_back(pDecayVertex);
777 findBrem( trackCollection, vertexCollection );
782 void ::DecayChain::integrityCheck()
789 const auto& decayTrack=decayTracks[
index];
793 if( decayTrack.pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex." );
798 size_t numberOfTimesListed=0;
799 for(
const auto pSiblingTrack : decayTrack.pParentVertex->daughterTracks )
801 if( pSiblingTrack==&decayTrack ) ++numberOfTimesListed;
803 if( numberOfTimesListed!=1 )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose parent does not have it listed once and only once as a child." );
808 for(
const auto pDaughterVertex : decayTrack.daughterVertices )
810 if( pDaughterVertex->pParentTrack!=&decayTrack )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose child does not have it listed as the parent." );
816 const DecayChainVertex* pAncestorVertex=decayTrack.pParentVertex;
817 while( pAncestorVertex->pParentTrack!=
NULL )
819 if( pAncestorVertex->pParentTrack->pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex higher in the decay chain." );
820 pAncestorVertex=pAncestorVertex->pParentTrack->pParentVertex;
822 if(
std::find( rootVertices.begin(), rootVertices.end(), pAncestorVertex )==rootVertices.end() )
824 throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose root vertex is not recorded anywhere." );
833 const auto& decayVertex=decayVertices[
index];
838 const DecayChainVertex* pAncestorVertex=&decayVertex;
839 while( pAncestorVertex->pParentTrack!=
NULL )
841 if( pAncestorVertex->pParentTrack->pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex higher in the vertex decay chain." );
842 pAncestorVertex=pAncestorVertex->pParentTrack->pParentVertex;
844 if(
std::find( rootVertices.begin(), rootVertices.end(), pAncestorVertex )==rootVertices.end() )
846 throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose root vertex is not recorded anywhere." );
852 if( decayVertex.pParentTrack!=
NULL )
854 size_t numberOfTimesListed=0;
855 for(
const auto pSibling : decayVertex.pParentTrack->daughterVertices )
857 if( pSibling==&decayVertex ) ++numberOfTimesListed;
859 if( numberOfTimesListed!=1 )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainVertex whose parent does not have it listed once and only once as a child." );
865 for(
const auto pDaughter : decayVertex.daughterTracks )
867 if( pDaughter->pParentVertex!=&decayVertex )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainVertex whose child does not have it listed as the parent." );
871 std::cout <<
"TrackingTruthAccumulator.cc integrityCheck() completed successfully" << std::endl;
874 void ::DecayChain::findBrem(
const std::vector<SimTrack>& trackCollection,
const std::vector<SimVertex>& vertexCollection )
878 auto& vertex=decayVertices_[
index];
881 if( vertex.pParentTrack==
NULL )
continue;
882 int parentTrackPDG=trackCollection[vertex.pParentTrack->simTrackIndex].type();
883 if(
std::abs( parentTrackPDG )!=11 )
continue;
885 size_t numberOfElectrons=0;
886 size_t numberOfNonElectronsOrPhotons=0;
887 for(
auto& pDaughterTrack : vertex.daughterTracks )
889 const auto& simTrack=trackCollection[pDaughterTrack->simTrackIndex];
890 if( simTrack.
type()==11 || simTrack.
type()==-11 ) ++numberOfElectrons;
891 else if( simTrack.
type()!=22 ) ++numberOfNonElectronsOrPhotons;
893 if( numberOfElectrons==1 && numberOfNonElectronsOrPhotons==0 )
897 for(
auto& pDaughterTrack : vertex.daughterTracks ) pDaughterTrack->pMergedBremSource=vertex.pParentTrack;
898 vertex.pMergedBremSource=vertex.pParentTrack->pParentVertex;
911 : output_(outputCollections),
912 trackingParticleIndices_(decayChain.decayTracksSize,-1),
913 trackingVertexIndices_(decayChain.decayVerticesSize,-1)
920 if( trackingParticleIndices_[pDecayTrack->simTrackIndex]!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::addTrackingParticle - trying to add a particle twice" );
922 trackingParticleIndices_[pDecayTrack->simTrackIndex]=output_.pTrackingParticles->size();
923 output_.pTrackingParticles->push_back( trackingParticle );
926 output_.pTrackingParticles->back().clearDecayVertices();
927 output_.pTrackingParticles->back().clearParentVertex();
930 associateToExistingObjects( pDecayTrack );
932 return &output_.pTrackingParticles->back();
935 TrackingVertex* ::OutputCollectionWrapper::addTrackingVertex( const ::DecayChainVertex* pDecayVertex,
const TrackingVertex& trackingVertex )
937 if( trackingVertexIndices_[pDecayVertex->simVertexIndex]!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::addTrackingVertex - trying to add a vertex twice" );
939 trackingVertexIndices_[pDecayVertex->simVertexIndex]=output_.pTrackingVertices->size();
940 output_.pTrackingVertices->push_back( trackingVertex );
943 associateToExistingObjects( pDecayVertex );
945 return &output_.pTrackingVertices->back();
948 TrackingParticle* ::OutputCollectionWrapper::getTrackingParticle( const ::DecayChainTrack* pDecayTrack )
950 const int index=trackingParticleIndices_[pDecayTrack->simTrackIndex];
951 if( index==-1 )
return NULL;
952 else return &(*output_.pTrackingParticles)[index];
955 TrackingVertex* ::OutputCollectionWrapper::getTrackingVertex( const ::DecayChainVertex* pDecayVertex )
957 const int index=trackingVertexIndices_[pDecayVertex->simVertexIndex];
958 if( index==-1 )
return NULL;
959 else return &(*output_.pTrackingVertices)[index];
964 const int index=trackingParticleIndices_[pDecayTrack->simTrackIndex];
965 if( index==-1 )
throw std::runtime_error(
"OutputCollectionWrapper::getRefTrackingParticle - ref requested for a non existent TrackingParticle" );
971 const int index=trackingVertexIndices_[pDecayVertex->simVertexIndex];
972 if( index==-1 )
throw std::runtime_error(
"OutputCollectionWrapper::getRefTrackingParticle - ref requested for a non existent TrackingVertex" );
976 void ::OutputCollectionWrapper::setProxy( const ::DecayChainTrack* pOriginalTrack, const ::DecayChainTrack* pProxyTrack )
978 int& index=trackingParticleIndices_[pOriginalTrack->simTrackIndex];
979 if( index!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::setProxy() was called for a TrackingParticle that has already been created" );
981 index=trackingParticleIndices_[pProxyTrack->simTrackIndex];
984 void ::OutputCollectionWrapper::setProxy( const ::DecayChainVertex* pOriginalVertex, const ::DecayChainVertex* pProxyVertex )
986 int& index=trackingVertexIndices_[pOriginalVertex->simVertexIndex];
987 const int newIndex=trackingVertexIndices_[pProxyVertex->simVertexIndex];
989 if( index!=-1 && index!=newIndex )
throw std::runtime_error(
"OutputCollectionWrapper::setProxy() was called for a TrackingVertex that has already been created" );
995 void ::OutputCollectionWrapper::associateToExistingObjects( const ::DecayChainVertex* pChainVertex )
998 TrackingVertex* pTrackingVertex=getTrackingVertex( pChainVertex );
999 if( pTrackingVertex==
NULL )
throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingVertex" );
1004 ::DecayChainTrack* pParentChainTrack=pChainVertex->pParentTrack;
1005 if( pParentChainTrack!=
NULL )
1008 TrackingParticle* pParentTrackingParticle=getTrackingParticle(pParentChainTrack);
1009 if( pParentTrackingParticle!=
NULL )
1026 void ::OutputCollectionWrapper::associateToExistingObjects( const ::DecayChainTrack* pChainTrack )
1032 if( pTrackingParticle==
NULL )
throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingParticle" );
1036 ::DecayChainVertex* pParentChainVertex=pChainTrack->pParentVertex;
1037 TrackingVertex* pParentTrackingVertex=getTrackingVertex( pParentChainVertex );
1049 for(
auto pDaughterChainVertex : pChainTrack->daughterVertices )
1051 TrackingVertex* pDaughterTrackingVertex=getTrackingVertex( pDaughterChainVertex );
1052 if( pDaughterTrackingVertex!=
NULL )
1068 int LayerFromDetid(
const DetId& detId )
1073 unsigned int subdetId=
static_cast<unsigned int>( detId.
subdetId() );
1078 layerNumber=tibid.
layer();
1083 layerNumber=tobid.
layer();
1088 layerNumber=tidid.
wheel();
1093 layerNumber=tecid.
wheel();
1098 layerNumber=pxbid.
layer();
1103 layerNumber=pxfid.
disk();
1105 else edm::LogVerbatim(
"TrackingTruthAccumulator" )<<
"Unknown subdetid: "<<subdetId;
1114 TrackingParticle* pTrackingParticle=pOutput->getTrackingParticle( pDecayTrack );
1115 if( pTrackingParticle==
NULL )
1118 TrackingVertex* pProductionVertex=pOutput->getTrackingVertex( pDecayTrack->pParentVertex );
1119 if( pProductionVertex==
NULL )
1126 pProductionVertex=pOutput->addTrackingVertex( pDecayTrack->pParentVertex, *trackingParticle.
parentVertex() );
1130 pTrackingParticle=pOutput->addTrackingParticle( pDecayTrack, trackingParticle );
1133 return pTrackingParticle;
1136 void addTrack( ::DecayChainTrack* pDecayChainTrack,
const TrackingParticleSelector* pSelector, ::OutputCollectionWrapper* pUnmergedOutput, ::OutputCollectionWrapper* pMergedOutput, const ::TrackingParticleFactory& objectFactory,
bool addAncestors )
1138 if( pDecayChainTrack==
NULL )
return;
1144 bool alreadyProcessed=
true;
1145 if( pUnmergedOutput!=
NULL )
1147 if( pUnmergedOutput->getTrackingParticle( pDecayChainTrack )==
NULL ) alreadyProcessed=
false;
1149 if( pMergedOutput!=
NULL )
1151 if( pMergedOutput->getTrackingParticle( pDecayChainTrack )==
NULL ) alreadyProcessed=
false;
1153 if( alreadyProcessed )
return;
1157 TrackingParticle newTrackingParticle=objectFactory.createTrackingParticle( pDecayChainTrack );
1167 dummyCollection.push_back( objectFactory.createTrackingVertex( pDecayChainTrack->pParentVertex) );
1174 if( !(*pSelector)( newTrackingParticle ) )
return;
1181 if( addAncestors ) addTrack( pDecayChainTrack->pParentVertex->pParentTrack,
NULL, pUnmergedOutput, pMergedOutput, objectFactory, addAncestors );
1185 if( pUnmergedOutput!=
NULL ) addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pUnmergedOutput );
1189 if( pMergedOutput!=
NULL )
1191 ::DecayChainTrack* pBremParentChainTrack=pDecayChainTrack;
1192 while( pBremParentChainTrack->pMergedBremSource!=
NULL ) pBremParentChainTrack=pBremParentChainTrack->pMergedBremSource;
1194 if( pBremParentChainTrack!=pDecayChainTrack )
1196 TrackingParticle* pBremParentTrackingParticle=addTrackAndParentVertex( pBremParentChainTrack, newTrackingParticle, pMergedOutput );
1209 pMergedOutput->setProxy( pDecayChainTrack->pParentVertex, pBremParentChainTrack->pParentVertex );
1214 addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pMergedOutput );
1219 for(
const auto& trackSegment : newTrackingParticle.
g4Tracks() )
1221 pBremParentTrackingParticle->
addG4Track( trackSegment );
1225 for(
const auto& genParticleRef : newTrackingParticle.
genParticles() )
1236 pMergedOutput->setProxy( pDecayChainTrack, pBremParentChainTrack );
1242 addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pMergedOutput );
helper::MatcherGetRef< C >::ref_type getRef(const Handle< C > &c, size_t k)
int bunchCrossing() const
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
EncodedEventId eventId() const
const bool ignoreTracksOutsideVolume_
int event() const
get the contents of the subdetector field (should be protected?)
unsigned int layer() const
layer id
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
virtual void initializeEvent(const edm::Event &event, const edm::EventSetup &setup)
std::vector< TrackingParticle > TrackingParticleCollection
ROOT::Math::Plane3D::Vector Vector
TrackingParticleRefProd refTrackingParticles
int pdgId() const
PDG ID.
const bool addAncestors_
Whether or not to add the full parentage of any TrackingParticle that is inserted in the collection...
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void addDaughterTrack(const TrackingParticleRef &)
const double vertexDistanceCut_
maximum distance for HepMC::GenVertex to be added to SimVertex
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void addParentTrack(const TrackingParticleRef &)
float charge() const
charge
bool signalOnly_
Uses the same config as selector_, but can be used to drop out early since selector_ requires the Tra...
unsigned int layer() const
layer id
void fillSimHits(std::vector< const PSimHit * > &returnValue, const T &event, const edm::EventSetup &setup)
Fills the supplied vector with pointers to the SimHits, checking for bad modules if required...
const unsigned int maximumSubsequentBunchCrossing_
uint32_t rawId() const
get the raw id
void setParentVertex(const TrackingVertexRef &ref)
void addGenParticle(const reco::GenParticleRef &ref)
SingleObjectSelector< TrackingParticleCollection,::TrackingParticleSelector > TrackingParticleSelector
const reco::GenParticleRefVector & genParticles() const
void accumulateEvent(const T &event, const edm::EventSetup &setup, const edm::Handle< edm::HepMCProduct > &hepMCproduct)
Both forms of accumulate() delegate to this templated method.
double y() const
Same as rapidity().
int bunchCrossing() const
get the detector field from this detid
void addG4Track(const SimTrack &t)
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
int numberOfTrackerLayers() const
The number of tracker layers with a hit.
virtual void finalizeEvent(edm::Event &event, const edm::EventSetup &setup)
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
const std::string messageCategory_
The message category used to send messages to MessageLogger.
Abs< T >::type abs(const T &t)
const math::XYZTLorentzVectorD & position() const
std::vector< std::string > getParameterNames() const
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's numbering enum) ...
edm::InputTag genParticleLabel_
TrackingVertexRefProd refTrackingVertexes
unsigned int disk() const
disk id
OutputCollections mergedOutput_
const edm::InputTag simTrackLabel_
bool allowDifferentProcessTypeForDifferentDetectors_
When counting hits, allows hits in different detectors to have a different process type...
std::auto_ptr< TrackingParticleCollection > pTrackingParticles
virtual void accumulate(const edm::Event &event, const edm::EventSetup &setup)
edm::Ref< TrackingVertexCollection > TrackingVertexRef
edm::Ref< edm::HepMCProduct, HepMC::GenVertex > GenVertexRef
unsigned int trackId() const
ParameterSet const & getParameterSet(std::string const &) const
std::auto_ptr< TrackingVertexCollection > pTrackingVertices
XYZPointD XYZPoint
point in space with cartesian internal representation
void addDecayVertex(const TrackingVertexRef &ref)
std::vector< TrackingVertex > TrackingVertexCollection
const std::vector< SimTrack > & g4Tracks() const
unsigned int layerNumber(align::ID, const TrackerTopology *)
Layer number increases with rho from 1 to 8.
int numberOfHits() const
Gives the total number of hits, including muon hits. Hits on overlaps in the same layer count separat...
unsigned int wheel() const
wheel id
const unsigned int maximumPreviousBunchCrossing_
const edm::InputTag simVertexLabel_
unsigned int layer() const
layer id
void setNumberOfTrackerHits(int numberOfTrackerHits)
int type() const
particle type (HEP PDT convension)
const TrackingVertexRef & parentVertex() const
EncodedEventId eventId() const
#define DEFINE_DIGI_ACCUMULATOR(type)
static int position[264][3]
bool chargedOnly_
Uses the same config as selector_, but can be used to drop out early since selector_ requires the Tra...
const bool createUnmergedCollection_
If bremsstrahlung merging, whether to also add the unmerged collection to the event or not...
TrackingParticleSelector selector_
Monte Carlo truth information used for tracking validation.
OutputCollections unmergedOutput_
int numberOfTrackerHits() const
The number of hits in the tracker. Hits on overlaps in the same layer count separately.
void setNumberOfTrackerLayers(const int numberOfTrackerLayers)
TrackingTruthAccumulator(const edm::ParameterSet &config, edm::one::EDProducerBase &mixMod, edm::ConsumesCollector &iC)
Replacement for TrackingTruthProducer in the new pileup mixing setup.
Detector det() const
get the detector field from this detid
const bool createMergedCollection_
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
edm::Ref< TrackingParticleCollection > TrackingParticleRef
edm::InputTag hepMCproductLabel_
Needed to add HepMC::GenVertex to SimVertex.
math::PtEtaPhiELorentzVectorF LorentzVector
unsigned int wheel() const
wheel id
void setNumberOfHits(int numberOfHits)
std::vector< edm::InputTag > collectionTags_
const double volumeRadius_