77 struct DecayChainTrack
80 struct DecayChainVertex* pParentVertex;
82 std::vector<struct DecayChainVertex*> daughterVertices;
83 DecayChainTrack* pMergedBremSource;
84 DecayChainTrack() : simTrackIndex(-1), pParentVertex(
NULL), pMergedBremSource(
NULL) {}
85 DecayChainTrack(
int newSimTrackIndex ) : simTrackIndex(newSimTrackIndex), pParentVertex(
NULL), pMergedBremSource() {}
92 struct DecayChainVertex
95 DecayChainTrack* pParentTrack;
96 std::vector<DecayChainTrack*> daughterTracks;
97 DecayChainVertex* pMergedBremSource;
98 DecayChainVertex() : simVertexIndex(-1), pParentTrack(
NULL), pMergedBremSource(
NULL) {}
99 DecayChainVertex(
int newIndex ) : simVertexIndex(newIndex), pParentTrack(
NULL), pMergedBremSource(
NULL) {}
116 const size_t decayTracksSize;
117 const size_t decayVerticesSize;
119 #if defined(DO_DEBUG_TESTING) 124 void integrityCheck();
126 const SimTrack& getSimTrack( const ::DecayChainTrack* pDecayTrack )
const {
return simTrackCollection_.at( pDecayTrack->simTrackIndex ); }
127 const SimVertex& getSimVertex( const ::DecayChainVertex* pDecayVertex )
const {
return simVertexCollection_.at( pDecayVertex->simVertexIndex ); }
130 std::unique_ptr< ::DecayChainTrack[]> decayTracks_;
131 std::unique_ptr< ::DecayChainVertex[]> decayVertices_;
134 std::vector< ::DecayChainVertex*> rootVertices_;
137 const std::vector<SimTrack>& simTrackCollection_;
138 const std::vector<SimVertex>& simVertexCollection_;
140 const std::unique_ptr< ::DecayChainTrack[]>& decayTracks;
141 const std::unique_ptr< ::DecayChainVertex[]>& decayVertices;
142 const std::vector< ::DecayChainVertex*>& rootVertices;
149 class TrackingParticleFactory
152 TrackingParticleFactory( const ::DecayChain& decayChain,
const edm::Handle< std::vector<reco::GenParticle> >& hGenParticles,
156 TrackingVertex createTrackingVertex(
const DecayChainVertex* pVertex)
const;
159 const ::DecayChain& decayChain_;
162 std::vector<int> genParticleIndices_;
163 const std::vector<const PSimHit*>& simHits_;
164 const double volumeRadius_;
165 const double volumeZ_;
166 const double vertexDistanceCut2_;
167 std::multimap<unsigned int, size_t> trackIdToHitIndex_;
168 bool allowDifferentProcessTypeForDifferentDetectors_;
175 class OutputCollectionWrapper
181 TrackingParticle* getTrackingParticle( const ::DecayChainTrack* pDecayTrack );
183 void setProxy( const ::DecayChainTrack* pOriginalTrack, const ::DecayChainTrack* pProxyTrack );
184 void setProxy( const ::DecayChainVertex* pOriginalVertex, const ::DecayChainVertex* pProxyVertex );
185 TrackingVertex* getTrackingVertex( const ::DecayChainVertex* pDecayVertex );
189 void associateToExistingObjects( const ::DecayChainVertex* pChainVertex );
190 void associateToExistingObjects( const ::DecayChainTrack* pChainTrack );
192 std::vector<int> trackingParticleIndices_;
193 std::vector<int> trackingVertexIndices_;
206 void addTrack( ::DecayChainTrack* pDecayChainTrack,
const TrackingParticleSelector* pSelector, ::OutputCollectionWrapper* pUnmergedOutput, ::OutputCollectionWrapper* pMergedOutput, const ::TrackingParticleFactory& objectFactory,
bool addAncestors,
const TrackerTopology *tTopo);
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 createInitialVertexCollection_(config.getParameter<bool>(
"createInitialVertexCollection") ),
235 addAncestors_( config.getParameter<bool>(
"alwaysAddAncestors") ),
236 removeDeadModules_( config.getParameter<bool>(
"removeDeadModules") ),
237 simTrackLabel_( config.getParameter<
edm::InputTag>(
"simTrackCollection") ),
238 simVertexLabel_( config.getParameter<
edm::InputTag>(
"simVertexCollection") ),
240 genParticleLabel_( config.getParameter<
edm::InputTag>(
"genParticleCollection") ),
241 hepMCproductLabel_( config.getParameter<
edm::InputTag>(
"HepMCProductLabel") ),
242 allowDifferentProcessTypeForDifferentDetectors_( config.getParameter<bool>(
"allowDifferentSimHitProcesses") )
250 <<
"set to false, which means no collections will be created";
254 if( config.
exists(
"select" ) )
312 std::vector<std::string> parameterNames=simHitCollectionConfig.
getParameterNames();
314 for(
const auto& parameterName : parameterNames )
316 std::vector<edm::InputTag> tags=simHitCollectionConfig.getParameter<std::vector<edm::InputTag> >(parameterName);
321 iC.
consumes<std::vector<PSimHit> >(collectionTag);
385 <<
" TrackingVertexs to the event.";
394 <<
" merged TrackingVertexs to the event.";
448 DecayChain decayChain( *hSimTracks, *hSimVertices );
451 std::unique_ptr< ::OutputCollectionWrapper> pUnmergedCollectionWrapper;
452 std::unique_ptr< ::OutputCollectionWrapper> pMergedCollectionWrapper;
456 std::vector<const PSimHit*> simHitPointers;
460 #if defined(DO_DEBUG_TESTING) 463 decayChain.integrityCheck();
476 ::DecayChainTrack* pDecayTrack=&decayChain.decayTracks[
index];
490 const SimVertex&
simVertex=hSimVertices->at( pDecayTrack->pParentVertex->simVertexIndex );
491 if( !objectFactory.vectorIsInsideVolume( simVertex.
position() ) )
continue;
498 ::addTrack( pDecayTrack, pSelector, pUnmergedCollectionWrapper.get(), pMergedCollectionWrapper.get(), objectFactory,
addAncestors_, tTopo );
510 for(
const auto& pRootVertex : decayChain.rootVertices )
512 const SimVertex& vertex=hSimVertices->at(decayChain.rootVertices[0]->simVertexIndex);
513 if( vertex.
vertexId()!=0 )
continue;
527 event.getByLabel( collectionTag, hSimHits );
530 for(
const auto&
simHit : *hSimHits )
532 returnValue.push_back( &
simHit );
540 std::sort(returnValue.begin(), returnValue.end(), [](
const PSimHit *
a,
const PSimHit *
b) {
542 const auto btof =
edm::isFinite(
b->timeOfFlight()) ?
b->timeOfFlight() : std::numeric_limits<decltype(
b->timeOfFlight())>::
max();
570 ::TrackingParticleFactory::TrackingParticleFactory( const ::DecayChain& decayChain,
const edm::Handle< std::vector<reco::GenParticle> >& hGenParticles,
573 : decayChain_(decayChain), hGenParticles_(hGenParticles), hepMCproduct_(hepMCproduct), simHits_(simHits),
volumeRadius_(volumeRadius),
580 trackIdToHitIndex_.insert( std::make_pair( simHits_[
index]->trackId(),
index ) );
583 if( hHepMCGenParticleIndices.isValid() )
585 genParticleIndices_.resize( hHepMCGenParticleIndices->size()+1 );
589 for(
size_t recoGenParticleIndex=0; recoGenParticleIndex<hHepMCGenParticleIndices->size(); ++recoGenParticleIndex )
591 size_t hepMCGenParticleIndex=(*hHepMCGenParticleIndices)[recoGenParticleIndex];
594 if( genParticleIndices_.size()<=hepMCGenParticleIndex ) genParticleIndices_.resize(hepMCGenParticleIndex+1);
596 genParticleIndices_[ hepMCGenParticleIndex ]=recoGenParticleIndex;
607 const SimVertex& parentSimVertex=decayChain_.getSimVertex( pChainTrack->pParentVertex );
609 LorentzVector
position( 0, 0, 0, 0 );
626 if( hepMCGenParticleIndex>=0 && hepMCGenParticleIndex<static_cast<int>(genParticleIndices_.size()) && hGenParticles_.isValid() )
628 int recoGenParticleIndex=genParticleIndices_[hepMCGenParticleIndex];
630 pdgId=generatorParticleRef->pdgId();
640 size_t matchedHits=0;
641 size_t numberOfHits=0;
642 size_t numberOfTrackerHits=0;
658 for(
auto iHitIndex=trackIdToHitIndex_.lower_bound( simTrack.
trackId() ),
end=trackIdToHitIndex_.upper_bound( simTrack.
trackId() );
662 const auto& pSimHit=simHits_[ iHitIndex->second ];
665 if(pSimHit->particleType() !=
pdgId)
671 processType=pSimHit->processType();
672 particleType=pSimHit->particleType();
673 newDetector=
DetId( pSimHit->detUnitId() );
677 oldDetector=newDetector;
678 newDetector=
DetId( pSimHit->detUnitId() );
685 if( processType==pSimHit->processType() && particleType==pSimHit->particleType() )
691 ++numberOfTrackerHits;
693 newLayer=tTopo->
layer( newDetector );
696 if( (oldLayer!=newLayer || (oldLayer==newLayer && oldDetector.
subdetId()!=newDetector.
subdetId())) ) ++matchedHits;
708 TrackingVertex TrackingParticleFactory::createTrackingVertex( const ::DecayChainVertex* pChainVertex)
const 717 bool isInVolume=this->vectorIsInsideVolume( simVertex.
position() );
727 const HepMC::GenEvent*
genEvent = hepMCproduct_->GetEvent();
729 if (genEvent !=
NULL)
731 Vector tvPosition(returnValue.position().x(), returnValue.position().y(), returnValue.position().z());
733 for (HepMC::GenEvent::vertex_const_iterator iGenVertex = genEvent->vertices_begin(); iGenVertex != genEvent->vertices_end(); ++iGenVertex)
735 HepMC::ThreeVector rawPosition = (*iGenVertex)->position();
737 Vector genPosition(rawPosition.x()*0.1, rawPosition.y()*0.1, rawPosition.z()*0.1);
739 auto distance2 = (tvPosition - genPosition).
mag2();
741 if (distance2 < vertexDistanceCut2_)
742 returnValue.addGenVertex(
GenVertexRef(hepMCproduct_, (*iGenVertex)->barcode()) );
762 : decayTracksSize( trackCollection.size() ),
763 decayVerticesSize( vertexCollection.size() ),
764 decayTracks_(
new DecayChainTrack[decayTracksSize] ),
765 decayVertices_(
new DecayChainVertex[decayVerticesSize] ),
766 simTrackCollection_( trackCollection ),
767 simVertexCollection_( vertexCollection ),
768 decayTracks( decayTracks_ ),
769 decayVertices( decayVertices_ ),
770 rootVertices( rootVertices_ )
773 std::map<int,::DecayChainTrack*> trackIdToDecayTrack;
774 std::map<int,::DecayChainVertex*> vertexIdToDecayVertex;
780 size_t decayVertexIndex=0;
783 ::DecayChainTrack* pDecayTrack=&decayTracks_[
index];
788 pDecayTrack->simTrackIndex=
index;
790 trackIdToDecayTrack[ trackCollection[
index].trackId() ]=pDecayTrack;
792 int parentVertexIndex=trackCollection[
index].vertIndex();
793 if( parentVertexIndex>=0 )
796 ::DecayChainVertex*& pParentVertex=vertexIdToDecayVertex[parentVertexIndex];
797 if( pParentVertex==
NULL )
800 pParentVertex=&decayVertices_[decayVertexIndex];
802 pParentVertex->simVertexIndex=parentVertexIndex;
804 pParentVertex->daughterTracks.push_back(pDecayTrack);
805 pDecayTrack->pParentVertex=pParentVertex;
807 else throw std::runtime_error(
"TrackingTruthAccumulator: Found a track with an invalid parent vertex index." );
819 for(
auto& decayVertexMapPair : vertexIdToDecayVertex )
821 ::DecayChainVertex* pDecayVertex=decayVertexMapPair.second;
822 int parentTrackIndex=vertexCollection[pDecayVertex->simVertexIndex].parentIndex();
823 if( parentTrackIndex!=-1 )
825 std::map<int,::DecayChainTrack*>::iterator iParentTrackMapPair=trackIdToDecayTrack.find(parentTrackIndex);
826 if( iParentTrackMapPair==trackIdToDecayTrack.end() )
828 std::stringstream errorStream;
829 errorStream <<
"TrackingTruthAccumulator: Something has gone wrong with the indexing. Parent track index is " << parentTrackIndex <<
".";
830 throw std::runtime_error( errorStream.str() );
833 ::DecayChainTrack* pParentTrackHierarchy=iParentTrackMapPair->second;
835 pParentTrackHierarchy->daughterVertices.push_back( pDecayVertex );
836 pDecayVertex->pParentTrack=pParentTrackHierarchy;
838 else rootVertices_.push_back(pDecayVertex);
841 findBrem( trackCollection, vertexCollection );
845 #if defined(DO_DEBUG_TESTING) 847 void ::DecayChain::integrityCheck()
854 const auto& decayTrack=decayTracks[
index];
858 if( decayTrack.pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex." );
863 size_t numberOfTimesListed=0;
864 for(
const auto pSiblingTrack : decayTrack.pParentVertex->daughterTracks )
866 if( pSiblingTrack==&decayTrack ) ++numberOfTimesListed;
868 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." );
873 for(
const auto pDaughterVertex : decayTrack.daughterVertices )
875 if( pDaughterVertex->pParentTrack!=&decayTrack )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose child does not have it listed as the parent." );
881 const DecayChainVertex* pAncestorVertex=decayTrack.pParentVertex;
882 while( pAncestorVertex->pParentTrack!=
NULL )
884 if( pAncestorVertex->pParentTrack->pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex higher in the decay chain." );
885 pAncestorVertex=pAncestorVertex->pParentTrack->pParentVertex;
887 if(
std::find( rootVertices.begin(), rootVertices.end(), pAncestorVertex )==rootVertices.end() )
889 throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose root vertex is not recorded anywhere." );
898 const auto& decayVertex=decayVertices[
index];
903 const DecayChainVertex* pAncestorVertex=&decayVertex;
904 while( pAncestorVertex->pParentTrack!=
NULL )
906 if( pAncestorVertex->pParentTrack->pParentVertex==
NULL )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack with no parent vertex higher in the vertex decay chain." );
907 pAncestorVertex=pAncestorVertex->pParentTrack->pParentVertex;
909 if(
std::find( rootVertices.begin(), rootVertices.end(), pAncestorVertex )==rootVertices.end() )
911 throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainTrack whose root vertex is not recorded anywhere." );
917 if( decayVertex.pParentTrack!=
NULL )
919 size_t numberOfTimesListed=0;
920 for(
const auto pSibling : decayVertex.pParentTrack->daughterVertices )
922 if( pSibling==&decayVertex ) ++numberOfTimesListed;
924 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." );
930 for(
const auto pDaughter : decayVertex.daughterTracks )
932 if( pDaughter->pParentVertex!=&decayVertex )
throw std::runtime_error(
"TrackingTruthAccumulator.cc integrityCheck(): Found DecayChainVertex whose child does not have it listed as the parent." );
936 std::cout <<
"TrackingTruthAccumulator.cc integrityCheck() completed successfully" << std::endl;
940 void ::DecayChain::findBrem(
const std::vector<SimTrack>& trackCollection,
const std::vector<SimVertex>& vertexCollection )
944 auto& vertex=decayVertices_[
index];
947 if( vertex.pParentTrack==
NULL )
continue;
948 int parentTrackPDG=trackCollection[vertex.pParentTrack->simTrackIndex].type();
949 if(
std::abs( parentTrackPDG )!=11 )
continue;
951 size_t numberOfElectrons=0;
952 size_t numberOfNonElectronsOrPhotons=0;
953 for(
auto& pDaughterTrack : vertex.daughterTracks )
955 const auto&
simTrack=trackCollection[pDaughterTrack->simTrackIndex];
957 else if(
simTrack.type()!=22 ) ++numberOfNonElectronsOrPhotons;
959 if( numberOfElectrons==1 && numberOfNonElectronsOrPhotons==0 )
963 for(
auto& pDaughterTrack : vertex.daughterTracks ) pDaughterTrack->pMergedBremSource=vertex.pParentTrack;
964 vertex.pMergedBremSource=vertex.pParentTrack->pParentVertex;
977 : output_(outputCollections),
978 trackingParticleIndices_(decayChain.decayTracksSize,-1),
979 trackingVertexIndices_(decayChain.decayVerticesSize,-1)
986 if( trackingParticleIndices_[pDecayTrack->simTrackIndex]!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::addTrackingParticle - trying to add a particle twice" );
988 trackingParticleIndices_[pDecayTrack->simTrackIndex]=output_.pTrackingParticles->size();
989 output_.pTrackingParticles->push_back( trackingParticle );
992 output_.pTrackingParticles->back().clearDecayVertices();
993 output_.pTrackingParticles->back().clearParentVertex();
996 associateToExistingObjects( pDecayTrack );
998 return &output_.pTrackingParticles->back();
1001 TrackingVertex* ::OutputCollectionWrapper::addTrackingVertex( const ::DecayChainVertex* pDecayVertex,
const TrackingVertex& trackingVertex )
1003 if( trackingVertexIndices_[pDecayVertex->simVertexIndex]!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::addTrackingVertex - trying to add a vertex twice" );
1005 trackingVertexIndices_[pDecayVertex->simVertexIndex]=output_.pTrackingVertices->size();
1006 output_.pTrackingVertices->push_back( trackingVertex );
1009 associateToExistingObjects( pDecayVertex );
1011 return &output_.pTrackingVertices->back();
1014 TrackingParticle* ::OutputCollectionWrapper::getTrackingParticle( const ::DecayChainTrack* pDecayTrack )
1016 const int index=trackingParticleIndices_[pDecayTrack->simTrackIndex];
1017 if( index==-1 )
return NULL;
1018 else return &(*output_.pTrackingParticles)[index];
1021 TrackingVertex* ::OutputCollectionWrapper::getTrackingVertex( const ::DecayChainVertex* pDecayVertex )
1023 const int index=trackingVertexIndices_[pDecayVertex->simVertexIndex];
1024 if( index==-1 )
return NULL;
1025 else return &(*output_.pTrackingVertices)[index];
1030 const int index=trackingParticleIndices_[pDecayTrack->simTrackIndex];
1031 if( index==-1 )
throw std::runtime_error(
"OutputCollectionWrapper::getRefTrackingParticle - ref requested for a non existent TrackingParticle" );
1037 const int index=trackingVertexIndices_[pDecayVertex->simVertexIndex];
1038 if( index==-1 )
throw std::runtime_error(
"OutputCollectionWrapper::getRefTrackingParticle - ref requested for a non existent TrackingVertex" );
1042 void ::OutputCollectionWrapper::setProxy( const ::DecayChainTrack* pOriginalTrack, const ::DecayChainTrack* pProxyTrack )
1044 int&
index=trackingParticleIndices_[pOriginalTrack->simTrackIndex];
1045 if( index!=-1 )
throw std::runtime_error(
"OutputCollectionWrapper::setProxy() was called for a TrackingParticle that has already been created" );
1047 index=trackingParticleIndices_[pProxyTrack->simTrackIndex];
1050 void ::OutputCollectionWrapper::setProxy( const ::DecayChainVertex* pOriginalVertex, const ::DecayChainVertex* pProxyVertex )
1052 int&
index=trackingVertexIndices_[pOriginalVertex->simVertexIndex];
1053 const int newIndex=trackingVertexIndices_[pProxyVertex->simVertexIndex];
1055 if( index!=-1 && index!=newIndex )
throw std::runtime_error(
"OutputCollectionWrapper::setProxy() was called for a TrackingVertex that has already been created" );
1061 void ::OutputCollectionWrapper::associateToExistingObjects( const ::DecayChainVertex* pChainVertex )
1064 TrackingVertex* pTrackingVertex=getTrackingVertex( pChainVertex );
1065 if( pTrackingVertex==
NULL )
throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingVertex" );
1070 ::DecayChainTrack* pParentChainTrack=pChainVertex->pParentTrack;
1071 if( pParentChainTrack!=
NULL )
1074 TrackingParticle* pParentTrackingParticle=getTrackingParticle(pParentChainTrack);
1075 if( pParentTrackingParticle!=
NULL )
1092 void ::OutputCollectionWrapper::associateToExistingObjects( const ::DecayChainTrack* pChainTrack )
1098 if( pTrackingParticle==
NULL )
throw std::runtime_error(
"associateToExistingObjects was passed a non existent TrackingParticle" );
1102 ::DecayChainVertex* pParentChainVertex=pChainTrack->pParentVertex;
1103 TrackingVertex* pParentTrackingVertex=getTrackingVertex( pParentChainVertex );
1115 for(
auto pDaughterChainVertex : pChainTrack->daughterVertices )
1117 TrackingVertex* pDaughterTrackingVertex=getTrackingVertex( pDaughterChainVertex );
1118 if( pDaughterTrackingVertex!=
NULL )
1131 TrackingParticle* pTrackingParticle=pOutput->getTrackingParticle( pDecayTrack );
1132 if( pTrackingParticle==
NULL )
1135 if( pOutput->getTrackingVertex( pDecayTrack->pParentVertex ) ==
nullptr )
1142 pOutput->addTrackingVertex( pDecayTrack->pParentVertex, *trackingParticle.
parentVertex() );
1146 pTrackingParticle=pOutput->addTrackingParticle( pDecayTrack, trackingParticle );
1149 return pTrackingParticle;
1152 void addTrack( ::DecayChainTrack* pDecayChainTrack,
const TrackingParticleSelector* pSelector, ::OutputCollectionWrapper* pUnmergedOutput, ::OutputCollectionWrapper* pMergedOutput, const ::TrackingParticleFactory& objectFactory,
bool addAncestors,
const TrackerTopology *tTopo )
1154 if( pDecayChainTrack==
NULL )
return;
1160 bool alreadyProcessed=
true;
1161 if( pUnmergedOutput!=
NULL )
1163 if( pUnmergedOutput->getTrackingParticle( pDecayChainTrack )==
NULL ) alreadyProcessed=
false;
1165 if( pMergedOutput!=
NULL )
1167 if( pMergedOutput->getTrackingParticle( pDecayChainTrack )==
NULL ) alreadyProcessed=
false;
1169 if( alreadyProcessed )
return;
1173 TrackingParticle newTrackingParticle=objectFactory.createTrackingParticle( pDecayChainTrack, tTopo );
1183 dummyCollection.push_back( objectFactory.createTrackingVertex( pDecayChainTrack->pParentVertex) );
1190 if( !(*pSelector)( newTrackingParticle ) )
return;
1197 if( addAncestors ) addTrack( pDecayChainTrack->pParentVertex->pParentTrack,
NULL, pUnmergedOutput, pMergedOutput, objectFactory, addAncestors, tTopo );
1201 if( pUnmergedOutput!=
NULL ) addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pUnmergedOutput );
1205 if( pMergedOutput!=
NULL )
1207 ::DecayChainTrack* pBremParentChainTrack=pDecayChainTrack;
1208 while( pBremParentChainTrack->pMergedBremSource!=
NULL ) pBremParentChainTrack=pBremParentChainTrack->pMergedBremSource;
1210 if( pBremParentChainTrack!=pDecayChainTrack )
1212 TrackingParticle* pBremParentTrackingParticle=addTrackAndParentVertex( pBremParentChainTrack, newTrackingParticle, pMergedOutput );
1225 pMergedOutput->setProxy( pDecayChainTrack->pParentVertex, pBremParentChainTrack->pParentVertex );
1230 addTrackAndParentVertex( pDecayChainTrack, newTrackingParticle, pMergedOutput );
1235 for(
const auto& trackSegment : newTrackingParticle.
g4Tracks() )
1237 pBremParentTrackingParticle->
addG4Track( trackSegment );
1241 for(
const auto& genParticleRef : newTrackingParticle.
genParticles() )
1252 pMergedOutput->setProxy( pDecayChainTrack, pBremParentChainTrack );
1258 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
std::unique_ptr< TrackingParticleCollection > pTrackingParticles
std::unique_ptr< TrackingVertexCollection > pInitialVertices_
EncodedEventId eventId() const
const bool ignoreTracksOutsideVolume_
int event() const
get the contents of the subdetector field (should be protected?)
const std::vector< SimTrack > & g4Tracks() const
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::unique_ptr< TrackingVertexCollection > pTrackingVertices
std::vector< TrackingParticle > TrackingParticleCollection
const reco::GenParticleRefVector & genParticles() const
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 &)
def setup(process, global_tag, zero_tesla=False)
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...
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_
void addG4Vertex(const SimVertex &)
void setParentVertex(const TrackingVertexRef &ref)
void addGenParticle(const reco::GenParticleRef &ref)
SingleObjectSelector< TrackingParticleCollection,::TrackingParticleSelector > TrackingParticleSelector
void accumulateEvent(const T &event, const edm::EventSetup &setup, const edm::Handle< edm::HepMCProduct > &hepMCproduct)
Both forms of accumulate() delegate to this templated method.
float timeOfFlight() const
simTrack
per collection params
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)
virtual void accumulate(const edm::Event &event, const edm::EventSetup &setup)
const math::XYZTLorentzVectorD & position() const
unsigned int vertexId() 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) ...
const TrackingVertexRef & parentVertex() const
edm::InputTag genParticleLabel_
TrackingVertexRefProd refTrackingVertexes
OutputCollections mergedOutput_
const edm::InputTag simTrackLabel_
bool allowDifferentProcessTypeForDifferentDetectors_
When counting hits, allows hits in different detectors to have a different process type...
edm::Ref< TrackingVertexCollection > TrackingVertexRef
edm::Ref< edm::HepMCProduct, HepMC::GenVertex > GenVertexRef
unsigned int trackId() const
const bool createInitialVertexCollection_
Whether or not to create a separate collection for just the initial interaction vertices.
ParameterSet const & getParameterSet(std::string const &) const
XYZPointD XYZPoint
point in space with cartesian internal representation
void addDecayVertex(const TrackingVertexRef &ref)
std::vector< TrackingVertex > TrackingVertexCollection
int numberOfHits() const
Gives the total number of hits, including muon hits. Hits on overlaps in the same layer count separat...
const unsigned int maximumPreviousBunchCrossing_
const edm::InputTag simVertexLabel_
unsigned int layer(const DetId &id) const
void setNumberOfTrackerHits(int numberOfTrackerHits)
int type() const
particle type (HEP PDT convension)
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_
TrackingTruthAccumulator(const edm::ParameterSet &config, edm::stream::EDProducerBase &mixMod, edm::ConsumesCollector &iC)
int numberOfTrackerHits() const
The number of hits in the tracker. Hits on overlaps in the same layer count separately.
void setNumberOfTrackerLayers(const int numberOfTrackerLayers)
Replacement for TrackingTruthProducer in the new pileup mixing setup.
Detector det() const
get the detector field from this detid
const bool createMergedCollection_
T const * product() const
edm::Ref< TrackingParticleCollection > TrackingParticleRef
edm::InputTag hepMCproductLabel_
Needed to add HepMC::GenVertex to SimVertex.
math::PtEtaPhiELorentzVectorF LorentzVector
void setNumberOfHits(int numberOfHits)
std::vector< edm::InputTag > collectionTags_
const double volumeRadius_